如何使用泛型的不同方法

时间:2010-10-15 23:37:27

标签: java generics

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,无论它是什么,因为我我正在施展它。

我是仿制药的新手,所以非常感谢任何帮助。我通过对类进行子类化来解决这个问题,但这半就错过了泛型。

请注意,问题不在于只为列表添加一个值。问题是泛型逻辑。 (只是要清楚)

2 个答案:

答案 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;
}

并删除整个类型变量,因为您的方法无法保证所有子项都是双重类型