Java通用设计有效性

时间:2013-04-07 17:14:24

标签: java generics

我有以下层次结构:

abstract class customType<E extends Number>
class customInteger extends customType<Integer>
class customFloat extends customType<Float> 

声明一个同时接受customInteger和customFloat

的LinkedList
List<customType<Number>> items = new LinkedList<customType<Number>>();

这种方法有效吗?

2 个答案:

答案 0 :(得分:2)

customType<Number>customType<Integer>无关 因此,如果您计划在Integer中添加Floatitems,则无效。
您可以尝试以下方法:

List<CustomType<?>> items = new LinkedList<CustomType<?>>();

将此作为项目的集合。要添加项目,您应该使用辅助方法,如下所示:

public static void addItemToList(List<? super CustomType<?>> l, CustomType<? extends Number> o){  
        l.add(o);  
}  

然后你可以添加到列表中:

CustomFloat f = new CustomFloat();  
CustomInteger i = new CustomInteger();  
process(items, i);    
process(items, f);  

答案 1 :(得分:1)

正如Cratylus所述,customType<Number>customType<Float>customType<Integer>是三种不相关的类型,因此这不起作用。但是,您可以使用List<customType<?>>作为items的类型。 customType<Float>customType<Integer>都是customType<?>的子类型(这意味着“任何customType,无论它具有什么泛型参数值),因此可以插入到集合中。

请注意,Java约定是使用大写字母开始类型名称,因此您应使用名称CustomTypeCustomIntegerCustomFloat