首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用泛型实现接口的Java抽象类

用泛型实现接口的Java抽象类
EN

Stack Overflow用户
提问于 2010-08-29 07:41:33
回答 5查看 31.1K关注 0票数 71

我正在尝试定义一个实现可比较的抽象类。当我用下面的定义定义这个类时:

代码语言:javascript
运行
复制
public abstract class MyClass implements Comparable <MyClass>

子类必须实现compareTo(MyClass object)。相反,我希望每个子类都实现compareTo(SubClass object),接受自己类型的对象。当我尝试用下面这样的东西来定义抽象类时:

代码语言:javascript
运行
复制
public abstract class MyClass implements Comparable <? extends MyClass>

它抱怨“超类型不能指定任何通配符”。

有解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-29 08:03:27

在我看来,它有点太冗长了,但很管用:

代码语言:javascript
运行
复制
public abstract class MyClass<T extends MyClass<T>> implements Comparable<T> {

}

public class SubClass extends MyClass<SubClass> {

    @Override
    public int compareTo(SubClass o) {
        // TODO Auto-generated method stub
        return 0;
    }

}
票数 53
EN

Stack Overflow用户

发布于 2010-08-29 10:16:27

参见Java自己的示例:

代码语言:javascript
运行
复制
public abstract class Enum<E extends Enum<E>> implements Comparable<E>
    public final int compareTo(E o)

关于seh的评论:通常情况下,论点是正确的。但是泛型使得类型关系变得更加复杂。在威利的解决方案中,SubClass可能不是MyClass的子类型...

SubClassAMyClass<SubClassA>的子类型,但不是MyClass<SubClassB>的子类型

类型MyClass<X>compareTo(X)定义了它的所有子类型都必须遵守的约定。这里没有任何问题。

票数 3
EN

Stack Overflow用户

发布于 2010-08-29 08:05:12

我不确定你是否需要捕获:

首先,将compareTo添加到抽象类中...

代码语言:javascript
运行
复制
public abstract class MyClass implements Comparable <MyClass> {

@Override
public int compareTo(MyClass c) {
...
}    
}

然后添加实现...

代码语言:javascript
运行
复制
public class MyClass1 extends MyClass {
...
}

public class MyClass2 extends MyClass {
...
}

调用compare将调用超类型方法...

代码语言:javascript
运行
复制
MyClass1 c1 = new MyClass1();
MyClass2 c2 = new MyClass2();

c1.compareTo(c2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3592939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档