我正在阅读有效Java [第27项]中关于泛型的章节.
书中有这一段:
允许(尽管相对罕见)类型参数受涉及该类型参数本身的某个表达式的限制.这就是所谓的递归类型绑定.
还有这个:
// Using a recursive type bound to express mutual comparability
public static <T extends Comparable<T>> T max(List<T> list) {...}
Run Code Online (Sandbox Code Playgroud)
什么是递归类型绑定以及上面的代码如何帮助实现相互可比性?
我想使用这样的界面:
public interface ResultItem {
public int getConfidence();
public boolean equals(ResultItem item);
public ResultItem cloneWithConfidence(int newConfidence);
}
Run Code Online (Sandbox Code Playgroud)
我通过表示语音识别结果的不同类型的对象来实现它.
我的想法是,我希望只比较同类的结果.也就是说,如果我创建一个类IntResult实现ResultItem,我希望方法签名变为:
public boolean equals(IntResult item);
public IntResult cloneWithConfidence(int newConfidence);
Run Code Online (Sandbox Code Playgroud)
我觉得我的界面中存在设计缺陷,因为现在我在cloneWithConfidence和返回ResultItem的其他方法的结果上使用非常难看的强制转换.
有没有更好的办法?
这个SO讨论提出了以下习语:
public interface IComparable<T extends IComparable<T>> {
int compare(T t);
}
Run Code Online (Sandbox Code Playgroud)
然后允许:
public class Foo implements IComparable<Foo> {
public int compare(Foo foo) {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这个习惯用法不仅仅包括以上代码,因为下面的代码也可以编译:
class A implements IComparable<A> {
public int compare(A a) {return 0;}
}
public class Foo implements IComparable<A> {
public int compare(A a) {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
因此(除非我误解了一些东西)原始成语并没有真正购买任何东西,而不是那么戏剧化:
public interface IComparesWith<T> {
int compare(T t);
}
public class A implements IComparesWith<A> {
public int compare(A a) {...}
}
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法实际声明一个接口,以便任何类声明实现它有一个方法来与它自己的类的对象进行比较,没有任何漏洞,如上所述?
我显然无法将上述内容发布为评论,因此我创建了一个新帖子.