我有以下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一起使用?
答案 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)