1

我有以下interface

public interface Identifiable {

    public Comparable<?> getIdentifier();

}

和一个实现类

public class Agreement implements Identifiable {

    private Long id;

    public Comparable<Long> getIdentifier() {
        return id;
    }
}

编辑:请注意,可能还有其他具有不同类型标识符的实现。
现在我想,是的,比较可比对象:

// Agreement a;
// Agreement b;
...
if (a.getIdentifier().compareTo(b.getIdentifier()) {
...

但是这compareTo给了我以下编译器错误:

Comparable<Long> 类型中的方法 compareTo(Long) 不适用于参数 (Comparable<Long>)

这个接口应该如何与泛型一起使用?

4

1 回答 1

10

Comparable<T>旨在用作泛型参数的上限:

public interface Identifiable<T extends Comparable<T>> {    
    public T getIdentifier();
}

public class Agreement implements Identifiable<Long> {

    private final Long id;

    public Long getIdentifier() {
        return id;
    }
}

这迫使返回类型为 a T,而不仅仅是可以与 a 进行比较的东西T


您的代码本质上是不安全的。
要了解原因,请考虑以下代码:

class Funny implements Comparable<Long> { ... }
class Funnier implements Identifiable {
    public Comparable<Long> getIdentifier() {
        return new Funny();
    }
}

Identifiable<Funny> funnier;
funnier.getIdentifier().compareTo(funnier.getIdentifier());
// You just tried to pass a Funny to compareTo(Long)
于 2012-08-22T13:46:32.367 回答