1

考虑这个假设的课程(我在一个在线视频中找到):

public class Contrived<T extends Number> extends ArrayList<T> {
      List <? extends T> values;
      ......
    }

Contrived这里可以接受的类型变量是Number或者一些子类型Number。但是类本身继承自ArrayList,所以无论类获得什么类型,都将决定ArrayList.

现在有一个字段叫做values,就是List<? extends T values>。那么这意味着什么?是否list可以容纳任何延伸的东西T(进而延伸Number)。

PECS (producer extends, consumer super)按照规则,我可以只用它来List读取元素而不是添加到list.

constructor如果我需要通过 a ,看起来会怎样list of doubles or some type T

4

1 回答 1

2

您可以有一个采用 aList<T>或 a的构造函数List<? extends T>。继续设计类:

class B extends Number{
   public double doubleValue() { return 0; }
   public float floatValue() { return 0; }
   public long longValue() { return 0; }
   public int intValue() { return 0; }
}
class C extends B{}

我在类中添加了一个人为的、合法的构造函数Contrived,采用List<? extends T>

public Contrived(List<? extends T> values)
{
   this.values = values;
}

这使我可以编写main如下方法:

public static void main(String[] args)
{
   List<C> bList = Arrays.asList(new C(), new C(), new C());
   Contrived<B> ci = new Contrived<B>(bList);
}

我可以将 a 传递给 aList<C>的构造函数Contrived<B>

另一种合法的人为构造函数的设计Contrived可能是,采用List<T>

public Contrived(List<T> values)
{
   this.values = values;
}

这样的构造函数不允许 a List<C>for a Contrived<B>,因为现在类型必须匹配,如以下两个Contrived示例所示:

public static void main(String[] args)
{
   List<C> cList = Arrays.asList(new C(), new C(), new C());
   Contrived<C> ci = new Contrived<C>(cList);  // must match now
}

public static void main(String[] args)
{
   List<B> bList = Arrays.asList(new B(), new B(), new B());
   Contrived<B> ci = new Contrived<B>(bList);  // must match now
}
于 2014-02-13T00:23:14.107 回答