2013-04-28 111 views
3

问题1: 考虑:泛型与集合

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

,如果我理解正确的,在ArrayList<>()的参数必须是Object,所以我们需要写呢?或者我们只是跳过这样的:

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

问题2: 考虑:

List<? extends Animal> myArray = new ArrayList<Dog>(); 

据我了解,中=左侧意味着myArrayList类型的引用,它可以是List<Cat>List<Dog>,.... =的右侧怎么样,这是什么意思?是否将参考myArray分配给List的实际对象,其中仅包含Dog?如果是的话,当=右边的信息有用或必要时,我不会想到这种情况。你能给我一个例子吗?

 ... = new ArrayList<Dog>(); 

是必不可少的或至少有用吗?

+0

你是什么意思 - ”*那么=的右边,它是什么意思?这是否意味着引用myArray被分配给List仅包含Dog的真实对象?如果是,我不能不要考虑=右侧的信息是有用还是必要的情况。*“? – Lion 2013-04-28 05:32:16

回答

2

第一个问题:Java 7 introduces the diamond operator,它充当句法糖在大多数情况下,写出完整的泛型类型的。它可以省略,但它“仍然存在”。

第二个问题:

  • 左侧是是upper-bounded generic wildcard列表。它包含包含任何扩展或实现名为Animal的类的对象。除非将列表定义为lower-bounded generic wildcard(使用super关键字),否则您将无法将任何值插入该列表。关于如何使用它们,何时使用它们以及如何将它们分类in this Java Trail还有一些。

  • 右侧悬挂有点不同寻常,但可用于指定上限泛型列表,如果您首先填充您想要的列表

    List<? extends Animal> fooList = new ArrayList<>(); 
    List<Dog> barList = new ArrayList<>(); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    
    fooList = barList; 
    

    你仍然有超过它迭代作为上界泛型类型:

    for(Animal d : fooList) { 
        d.walk(); 
        d.talk(); 
    } 
    

从本质上讲,你有办法,现在是在误导和没有帮助的,因为这新的ArrayList<Dog>是空的,无法添加到。 “

0

是否将引用myArray分配给仅包含Dog的List对象?

这意味着myArray被分配到一个包含Dog或任何类型的狗的列表,但是在使用myArray时,只保证包含在myArray中的对象是Animals。请注意,在java中,类型参数在编译时被擦除。

1
  1. 只要您使用Java 7,只要引用类型不包含通配符(如List<? extends Number>),就可以这样做。
  2. 当您使用通配符时,您只能执行类型安全操作。在这种情况下,你可以读出列表。

例如:

List<? extends Number> list = ...; 
//more code 
Number n = list.get(0); 

但你不能放元素融入到列表:

List<? extends Number> list = ...; 
//more code 
list.add(new Double(1.5)); //compile-time error 

你不能,因为你不知道实际类型的list 。如果该类型不是Double,而是Integer,该怎么办?

+0

钻石符号似乎在通配符Java 7中正常工作... – Makoto 2013-04-28 05:44:00

2

Q1:你可以跳过它在Java 7中

Q2:该声明并没有太大的意义。 List<? extends SomeClass>作为该方法的一个参数是有用的,以便开发人员能够传递包含扩展SomeClass的所有类型的列表。但是,禁止添加任何进入该名单:

public void addAnimal(List<? extends Animal> animals) { 
     animals.add(new Dog()); // Compiler error 
} 

如果要做到这一点,你将不得不使用super关键字:List<? super SomeClass>

参见: