Java Generics绑定与原始类型不匹配

时间:2011-08-25 04:00:37

标签: java generics jodatime

我有一个像

这样的签名的超级课程
public abstract class Foo<C extends Comparable<? super C>>{..}

所以C类应该是一个Comparable对象。

我想使用org.joda.time.Instant(版本1.6)作为子类中的类型参数

public class SubFoo<Instant>

不幸的是我收到了这个错误:

Bound mismatch: The type Instant is not a valid substitute for the bounded parameter <C extends Comparable<? super C>> of the type BigtablePoller<T,C>

Instant类扩展了AbstractInstant,它实现了Comparable(无类型参数)

有没有解决这个问题的方法?

我能够使其发挥作用的唯一方法是将Foo改为:

@SuppressWarnings("rawtypes")
public abstract class Foo<C extends Comparable> {}

我想避免警告,Josh Bloch说不要在新代码中使用原始类型(有效的java第23项)。

2 个答案:

答案 0 :(得分:2)

请使用:

public abstract class Foo<C extends Comparable<C>>

您的版本不起作用的原因是Instant被定义为extends Comparable<Instant>而不是extends Comparable<? super Instant>。如果使用边界,则边界也必须匹配。

答案 1 :(得分:1)

Joda time 1.6不支持泛型,因此有三种选择。

  1. 创建一个实现正确接口的包装类并使用它。
  2. 抑制超类上的警告并处理丑陋
  3. 升级到joda time 2.0,它支持Instant上的通用类似界面。