为了账号安全,请及时绑定邮箱和手机立即绑定

请问Java泛型:列表,列表<对象>,列表<?>

请问Java泛型:列表,列表<对象>,列表<?>

海绵宝宝撒 2019-10-21 16:12:08
Java泛型:列表,列表<对象>,列表<?>有人能尽可能详细地解释以下类型之间的区别吗?ListList<Object>List<?>让我说得更具体些。我什么时候想用// 1 public void CanYouGiveMeAnAnswer(List l) { }// 2public void CanYouGiveMeAnAnswer(List<Object> l) { }// 3public void CanYouGiveMeAnAnswer(List<?> l) { }
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

用我自己简单的话说:


列单


将声明一个普通集合,可以保存任何类型,并将始终返回对象。


列表<Object>


将创建一个列表,该列表可以容纳任何类型的对象,但只能分配另一个对象。列表<Object>


例如,这是行不通的;


List<Object> l = new ArrayList<String>();

当然,您可以添加任何东西,但只能拉动对象。


List<Object> l = new ArrayList<Object>();


l.add( new Employee() );

l.add( new String() );


Object o = l.get( 0 );

Object o2 = l.get( 1 );

最后


列表<?>


将允许您分配任何类型,包括


List <?> l = new ArrayList(); 

List <?> l2 = new ArrayList<String>();

这将被称为未知数既然共同的分母未知数是您将能够获取对象的对象(巧合)。


.的重要性未知数当它与子类一起使用时:


List<? extends Collection> l = new ArrayList<TreeSet>(); // compiles


List<? extends Collection> l = new ArrayList<String>(); // doesn't,

// because String is not part of *Collection* inheritance tree. 

我希望使用集合作为类型不会造成混乱,这是我唯一想到的树。


这里的区别是,我是不知道属于收藏等级制度。



查看完整回答
反对 回复 2019-10-22
?
慕沐林林

TA贡献2016条经验 获得超9个赞

为了在这里补充已经很好的答案:

方法论据:

List<? extends Foo>

如果您不打算更改列表,并且只关心列表中的所有内容都可指定为“foo”,则是一个不错的选择。这样,调用方就可以传递一个列表<foosubclass>,并且您的方法可以工作。通常是最好的选择。

List<Foo>

如果您打算将foo对象添加到您的方法中的列表中,这是很好的选择。调用方可能不会传入列表<foosubclass>,因为您打算向列表中添加foo。

List<? super Foo>

如果您打算将foo对象添加到列表中,并且列表中还有什么内容并不重要(即,您可以获得一个包含与foo无关的“Dog”的列表<Object>),这是一个不错的选择。

方法返回值

就像方法参数,但好处相反。

List<? extends Foo>

确保返回列表中的所有内容都键入“foo”。不过,它可能是List<foosubclass>。调用方不能添加到列表中。这是你的选择,也是目前为止最常见的情况。

List<Foo>

就像列表<?扩展foo>,但也允许调用方将其添加到列表中。不那么普通。

List<? super Foo>

允许调用方将foo对象添加到列表中,但不能保证从list.get(0).它可能是从Foo到Object的任何东西。唯一的保证是,这不会是一个列表的‘狗’或其他一些选择,以防止list.add(Foo)是合法的。非常罕见的用例。

我希望这能帮上忙。祝好运!

PS。总之.。两个问题.。

您需要添加到列表中吗?你在乎名单上有什么吗?

是的-使用列表<foo>。

是的,不使用列表<?超级福>

不,是的-使用<?扩展foo>-最常见的。

不使用<?>



查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 475 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信