public class MyGenerics<T extends Number>{
List<T> = new ArrayList<T>();
public void addToList(){
for (ListIterator<T> it; it.hasNext(); ){
it.next();
it.add(number());
}
}
public T number(){
return (T) 5*Math.pi;
}
}
据我所知,没有办法告诉编译器“我保证,number()返回的所有内容都是扩展Number的对象,并且会被转换为类型T,无论它是什么,因为我我正在施展它。
我是仿制药的新手,所以非常感谢任何帮助。我通过对类进行子类化来解决这个问题,但这半就错过了泛型。
请注意,问题不在于只为列表添加一个值。问题是泛型逻辑。 (只是要清楚)
答案 0 :(得分:4)
此问题将自动装箱与通用相结合。这不会很漂亮。
5 * Math.PI
是原始double
。要转换为任何类型的Number
对象,需要将其装箱。因此,编译器需要知道装箱操作的具体目标类型,但由于您使用的是泛型,因此缺少它。
如果未扩展课程,且number()
始终返回double
(或Double
),请勿使用use generics;明确并使用Double
代替T
。
如果要扩展类,并且要覆盖number()
方法,则仍然知道具体类型。使用匹配的类型参数声明子类中的List
(您忽略了名称)。
答案 1 :(得分:1)
您给出的类定义告诉编译器您只使用一个特定的子类类型Number填充列表。
如果要混合子类,则应将方法定义为以下
public Number number(){
return 5*Math.PI;
}
并删除整个类型变量,因为您的方法无法保证所有子项都是双重类型