如何使用Comparable <t>?</t>

时间:2012-08-22 13:45:01

标签: java generics

我有以下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&lt; Long&gt;类型中的compareTo(Long)方法不适用于参数(Comparable&lt; Long&gt;)

这个界面应该如何与Generics一起使用?

1 个答案:

答案 0 :(得分: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;
    }
}

这会强制返回类型为T,而不仅仅是可以与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)