为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2022-11-30 16:51:13
我正在阅读关于泛型的 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 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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

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

}

您不需要K类型参数。


查看完整回答
反对 回复 2022-11-30
?
慕森王

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> {


}


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信