我正在阅读关于泛型的 Java 文档,特别是关于有界类型的页面,我迷路了。这是我的代码的一个简单版本,对于上下文,我通常想要一个可比较的键,一个带有 an 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>我得到的错误是在 part 的第二个类的类型引用中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 回答
![?](http://img1.sycdn.imooc.com/533e4c5600017c5b02010200-100-100.jpg)
慕标5832272
TA贡献1966条经验 获得超4个赞
由于Integer
是最终类,因此正确的定义B
是:
public abstract class B<V> extends A<Integer,V> { }
您不需要K
类型参数。
![?](http://img1.sycdn.imooc.com/5458463b0001358f02200220-100-100.jpg)
慕森王
TA贡献1777条经验 获得超3个赞
发生编译器错误是因为虽然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.
至于以Dateas 为键的类,您可能也想这样做:
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> {
}
添加回答
举报
0/150
提交
取消