Java泛型-类型参数`K'不在其范围内;应该实施X

时间:2019-05-16 06:08:32

标签: java generics

我正在阅读有关泛型的Java文档,特别是关于有界类型的this page,并且迷路了。这是我的代码的简单版本,对于上下文,我通常需要一个可比较的键,一个具有Integer,另一个具有Date的抽象类,这只是基类和整数实施:

抽象类:

public abstract class A<K extends Comparable<K>, V> extends TreeMap<K, V>

整数抽象类:

public abstract class B<K extends Integer, V> extends A<K,V>

我得到的错误是在extends A<K,V>部分的第二类的类型引用中。具体来说,我的IDE位于K的下面,并说Type parameter 'K' is not within its bound; should implement 'java.lang.Comparable<K>'

对此我感到困惑,因为在Integer的定义中,它实现了Comparable<Integer>,这还不足以满足吗?而且,当我尝试执行以下操作public abstract class B<K extends Integer & Comparable<K>, V> extends A<K,V>时,该方法也不起作用。

我对仿制药有误解吗?

2 个答案:

答案 0 :(得分:4)

由于Integer是最终课程,因此B的正确定义是:

public abstract class B<V> extends A<Integer,V> {

}

您不需要K类型的参数。

答案 1 :(得分:2)

发生编译器错误是因为尽管Date实现了Comparable<Date>,但是Date的子类可能没有实现Comparable<SubclassOfDate>,所以编译器抱怨。

您可以通过更改A的声明以使用通配符来解决此问题:

public abstract class A<K extends Comparable<? super K>, V> extends TreeMap<K, V>

但是,您可能打算这样声明B

public abstract class B<V> extends A<Integer,V> {

}

Integerfinal,没有其他类可以继承它。因此,B不必在K上是通用的。

对于以Date作为键的类,您可能也想这样做:

public abstract class C<V> extends A<Date,V> {

}

但是由于Date不是final,因此您可以可以创建通用参数K extends Date

public abstract class C<K extends Date, V> extends A<K,V> {

}