Java 使用通用对象的已知方法

Java 使用通用对象的已知方法,java,generics,comparable,Java,Generics,Comparable,我让一个类接收2个未知的通用对象x和y。如果它们是可比较的,我必须将它们与对象进行比较。我发现我可以通过使用instanceof检查对象是否实现了Comparable接口,但我不知道如何使用.compareTo方法,尽管我知道对象实现了它们- 我想做的基本上是,x和y是通用对象: public void someMethod(E x, E y) { if (x instanceof Comparable && y instanceof Comparable) {

我让一个类接收2个未知的通用对象x和y。如果它们是可比较的,我必须将它们与对象进行比较。我发现我可以通过使用
instanceof
检查对象是否实现了
Comparable
接口,但我不知道如何使用
.compareTo
方法,尽管我知道对象实现了它们-

我想做的基本上是,x和y是通用对象:

public void someMethod(E x, E y) {
    if (x instanceof Comparable && y instanceof Comparable) {
        if(x.compareTo(y) < 0){    //The method compareTo(E) is undefined for the type E
            //do stuff
        }
    }
}
public方法(ex,ey){
if(x可比实例和y可比实例){
如果(x.compareTo(y)<0){//,则类型E的方法compareTo(E)未定义
//做事
}
}
}
有人能给我指出正确的方向吗?

检查后,您可以(也应该)安全地投射对象,以便根据需要使用它们

 if (x instanceof Comparable && y instanceof Comparable) {
    Comparable c1 = (Comparable) x;
    Comparable c2 = (Comparable) y;        
    if(c1.compareTo(c2) < 0){
        //do stuff
    }
}
if(x个可比实例和y个可比实例){
可比c1=(可比)x;
可比c2=(可比)y;
如果(c1.与(c2)相比<0){
//做事
}
}
检查后,您可以(也应该)安全地投射对象,以便根据需要使用它们

 if (x instanceof Comparable && y instanceof Comparable) {
    Comparable c1 = (Comparable) x;
    Comparable c2 = (Comparable) y;        
    if(c1.compareTo(c2) < 0){
        //do stuff
    }
}
if(x个可比实例和y个可比实例){
可比c1=(可比)x;
可比c2=(可比)y;
如果(c1.与(c2)相比<0){
//做事
}
}

您需要指定泛型类型绑定。现在,
E
可以是任何
对象
类型,但您似乎希望将其限制为实现
可比
的任何类型,如下所示:

public <T extends Comparable<? super T>> void someMethod(T x, T y) {
    if (x.compareTo(y) < 0) {
        //do stuff
    }
}

public您需要指定泛型类型绑定。现在,
E
可以是任何
对象
类型,但您似乎希望将其限制为实现
可比
的任何类型,如下所示:

public <T extends Comparable<? super T>> void someMethod(T x, T y) {
    if (x.compareTo(y) < 0) {
        //do stuff
    }
}

public您应该声明如下方法

public <E extends Comparable<E>> void someMethod(E x, E y)
public方法(ex,ey)

因此,在您的方法中,您可以确保使用compareTo方法。

您应该像这样声明该方法

public <E extends Comparable<E>> void someMethod(E x, E y)
public方法(ex,ey)

因此,在您的方法中,您可以确保使用compareTo方法。

好主意,但看起来他已经在类级别绑定了一个
E
类型,因此将一个方法绑定到另一个方法中会使另一个方法相形见绌(这不是很好,而且在编码样式中经常被禁止)。只需将
E
更改为另一个标识符(例如
T
)即可解决此问题。这是个好主意,但看起来他已经在类级别绑定了
E
类型,因此将其中一个方法用于某个方法会使另一个方法相形见绌(这不是很好,而且在编码样式中经常被禁止)。只需将
E
更改为另一个标识符(例如
T
)即可解决此问题。我不知道转换到接口是可能的,谢谢!回答正确,因为我不知道泛型元素implements.raw类型是否可以比较。我不知道转换到接口是可能的,谢谢!回答正确,因为我不知道泛型元素是否具有可比性。不应使用原始类型获得最佳结果使用
获得最佳结果使用