2015-05-29 96 views
1

这里的第一篇文章参数...Java的:不能返回泛型集合延伸的返回类型

这是我定义泛型类:

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扩展数字?

在此先感谢。

+0

'this.values()'的类型是什么? –

+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)); 

的更多信息:

+0

太棒了!说得通。谢谢卢卡斯 –

+0

在这种情况下提及并不是绝对必要的。因此,你可以指定它没有generic: 'public class TimeSeries extends TreeMap ' – nesteant

+0

@nesteant:这是不正确的。 OP *希望*具有通用的TimeSeries 类型,这非常合理。 –

1

如果您想返回Collection<Number>,您可以使用Collections.unmodifiableCollection,使一个只读视图在Collection<T>

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

unmodifiableCollection和它的堂兄弟Collections类非常方便将只读视图作为子类型集合的超类型集合。

+0

@LukasEder你使用的是什么版本的java?不可修改收藏的签名是'静态'收藏不可修改收藏(收藏 c)'。它编译我尝试过的每个Java版本,并且工作得很好。 – Misha

+0

有趣,我的坏。我似乎遇到了Eclipse编译器问题。将验证,但你的解决方案似乎很好 –