考虑这个假设类(我在在线视频中发现):
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
如果需要通过,外观会如何list of doubles or some type T
?
您可以有一个采用List<T>
或的构造函数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);
}
我可以将传递给List<C>
的构造函数Contrived<B>
。
合法的人为构造函数的另一种设计Contrived
可能是List<T>
:
public Contrived(List<T> values)
{
this.values = values;
}
这样的构造函数不允许使用List<C>
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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句