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 类型,无论它是什么,因为我正在类型转换它。
我是泛型新手,因此非常感谢任何帮助。我通过对类进行子类化来解决这个问题,但这半途而废了泛型的意义。
请注意,问题实际上并不是仅向列表添加一个值。问题在于泛型逻辑。 (只是为了清楚)
最佳答案
这个问题将自动装箱与泛型结合起来。这可不太好。
5 * Math.PI
是一个原始的 double
。要转换为任何类型的 Number
对象,需要对其进行装箱。因此,编译器需要知道装箱操作的具体目标类型,但由于您使用的是泛型,所以它丢失了。
如果类未扩展,并且 number()
始终返回 double
(或 Double
),请勿使用泛型;明确并使用 Double
代替 T
。
如果要扩展该类,并且要重写 number()
方法,您仍然知 Prop 体类型。使用匹配的类型参数在子类中声明 List
(您忽略了命名)。
关于java - 如何将不同的方法与泛型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3946891/