【问题标题】:Java Generics Bound mismatch with a raw typeJava 泛型绑定与原始类型不匹配
【发布时间】:2011-08-25 04:00:36
【问题描述】:

我有一个带有类似签名的超类

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 类扩展了实现 Comparable(无类型参数)的 AbstractInstant

有没有办法解决这个问题?

我能够使其工作的唯一方法是将 Foo 更改为:

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

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

【问题讨论】:

    标签: java generics jodatime


    【解决方案1】:

    就用这个吧:

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

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

    【讨论】:

    • 不幸的是,这也不起作用。我唯一能做的就是,但是我需要抑制警告......
    • &lt;C extends Comparable&lt;? super C&gt;&gt; is much better than &lt;C extends Comparable&lt;C&gt;&gt; "Instant is defined as extends Comparable&lt;Instant&gt;" Not it is not;请参阅 OP 的帖子:Instant extends AbstractInstant 实现了Comparable。如果这是通用的,它可能会实现Comparable&lt;AbstractInstant&gt;,因此与Comparable&lt;Instant&gt;不兼容,但会与Comparable&lt;? super Instant&gt;兼容
    【解决方案2】:

    Joda time 1.6 不支持泛型,所以有三个选项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多