Java:无法使用扩展返回类型的参数返回泛型Collection

时间:2015-05-29 04:56:55

标签: java generics

首先发布在这里......

这是我定义的通用类:

public class TimeSeries<T extends Number> extends TreeMap<Integer, T>{
     ...

     public Collection<Number> data() {
         return this.values();  
     }
}

一点背景。 TimeSeries基本上是一种特定的TreeMap,其中键是整数,值是数字。

我的问题是数据方法因以下错误而中断:

error: incompatible types: Collection<T> cannot be converted to Collection<Number>
    return this.values();   
                      ^
where T is a type-variable: T extends Number declared in class TimeSeries

值方法只返回一个T的集合。如果我特别声明T扩展了数字,为什么我不能将这个返回给方法?

提前致谢。

2 个答案:

答案 0 :(得分:4)

您必须返回以下任何类型:

public Collection<? extends Number> data() {
    return this.values();  
}

public Collection<T> data() {
    return this.values();  
}

这样想:

TimeSeries<Integer> series = new TimeSeries<>();

// You want this:
Collection<Number> data = series.data();

// Oops, compiles, but not an Integer:
data.add(Long.valueOf(42));

更多信息:

答案 1 :(得分:1)

如果您想返回Collection<Number>,可以使用Collections.unmodifiableCollectionCollection<T>制作只读视图:

public Collection<Number> data() {
    return Collections.unmodifiableCollection(this.values());
}

unmodifiableCollection及其Collections类中的表兄弟非常方便将只读视图作为超类型集合的超类型集合。