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

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

有人能尽可能详细地解释以下类型之间的区别吗?


List

List<Object>

List<?>

让我说得更具体些。我什么时候想用


// 1 

public void CanYouGiveMeAnAnswer(List l) { }


// 2

public void CanYouGiveMeAnAnswer(List<Object> l) { }


// 3

public void CanYouGiveMeAnAnswer(List<?> l) { }


海绵宝宝撒
浏览 480回答 3
3回答

白衣非少年

用我自己简单的话说:列单将声明一个普通集合,可以保存任何类型,并将始终返回对象。列表<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();&nbsp;List <?> l2 = new ArrayList<String>();这将被称为未知数既然共同的分母未知数是您将能够获取对象的对象(巧合)。.的重要性未知数当它与子类一起使用时:List<? extends Collection> l = new ArrayList<TreeSet>(); // compilesList<? extends Collection> l = new ArrayList<String>(); // doesn't,// because String is not part of *Collection* inheritance tree.&nbsp;我希望使用集合作为类型不会造成混乱,这是我唯一想到的树。这里的区别是,我是不知道属于收藏等级制度。

慕沐林林

为了在这里补充已经很好的答案:方法论据: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>-最常见的。不使用<?>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java