我正在阅读有关泛型的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>
时,该方法也不起作用。
我对仿制药有误解吗?
答案 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> {
}
Integer
是final
,没有其他类可以继承它。因此,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> {
}