【问题标题】:Bound Mismatch : Generic class (of a Generic class extending Comparable (of a Generic class extending Comparable))绑定不匹配:泛型类(泛型类扩展 Comparable(泛型类扩展 Comparable))
【发布时间】:2017-09-19 17:35:57
【问题描述】:

我知道这听起来很混乱,但这是我能解释的最好的了。 (您可以建议一个更好的标题)。我有 3 节课:-

A

public class A <T extends Comparable<T>> {
    ...
}

B

public class B {
    A<C> var = new A<C>(); 
    // Bound mismatch: The type C is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type A<T>
    ...
}

C

public class C <T extends Comparable<T>> implements Comparable<C>{
    private T t = null;
    public C (T t){
        this.t = t; 
    }
    @Override
    public int compareTo(C o) {
        return t.compareTo((T) o.t);
    }
    ...
}

我在尝试在 B 中实例化 A 时遇到错误

Bound mismatch:类型C不是A类型的有界参数>的有效替代

【问题讨论】:

  • 首先,您的CB 中的原始类型。并且还在CcompareTo 方法中。这里大量混合了原始类型和泛型 - 这就是您遇到问题的原因。
  • 是的,但是如果它实现了 Comparable,它不会工作吗?或者更好的是,有没有办法让它工作?
  • 没有。因为您的C&lt;T&gt; 只能与原始类型C 相媲美。正如我所说,你需要做更多的阅读。
  • 明白了!所以说我要存储整数,应该是A&lt;C&lt;Integer&gt;&gt; var = new A&lt;C&lt;Integer&gt;();

标签: java generics comparable


【解决方案1】:

感谢@Boris the Spider 上面的 cmets

问题在于CB 中的原始类型 .更改了实例化以包含参数(取决于需要)

A< C<Integer> > var = new A< C<Integer> >();

编辑 1: 另外,感谢下面的评论。更好的做法是将C中的 compareTo 方法改成这样,

public int compareTo(C<T> o) {
    return t.compareTo(o.t);
}

编辑 2: 此外,问题中有一个错字(w.r.t. cmets 下面)

public class C <T extends Comparable<T>> implements Comparable< C<T> >{...}

【讨论】:

  • 您还在 C 本身中使用原始类型 C
  • 你是对的!虽然没有必要,但我确实收到了警告。
  • 您使用原始类型C 的另一个地方是public class C &lt;T extends Comparable&lt;T&gt;&gt; implements Comparable&lt;C&gt;。应该是public class C &lt;T extends Comparable&lt;T&gt;&gt; implements Comparable&lt;C&lt;T&gt;&gt;。如果你使用原始类型,可能会发生一些非常奇怪的事情,所以要不惜一切代价避免它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多