Mar*_*tus 4 java generics interface
这个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)
那么,有没有办法实际声明一个接口,以便任何类声明实现它有一个方法来与它自己的类的对象进行比较,没有任何漏洞,如上所述?
我显然无法将上述内容发布为评论,因此我创建了一个新帖子.
你是正确的:这个成语并不能阻止比较不同类的类.它所做的只是确保比较对象也实现相同的接口.如果只需要比较相同类型,则可以由实现类强制执行.
你称之为" 漏洞 "的是我所谓的" 故意做你不想做的事情 ".
如果需要这样的行为,可以将Foo对象与A对象进行比较.
这是一个功能,而不是漏洞.
如果你想富到可以媲美其他FOOS,你应该定义美孚实现IComparable<Foo>
.
如果您不希望Foo与A相比,那么您不应该定义Foo来实现IComaparable<A>
.为什么有人会这样做,除非他们故意写破坏的代码?
你的问题的实际答案已经由@caskey提供:
" 不,你不能用Java中的接口做你想做的事.[你必须用类来做). "
你错过了一件事:
因此(除非我误解了一些东西)原始成语并没有真正购买任何东西,而不是那么戏剧化:
public interface IComparable<T>
在原来的成语 不买你的东西.它强制比较的对象必须实现IComparable.不那么引人注目的例子允许您无限制地将实现类与任何对象进行比较.所以...编译器将允许你指定Long
,或InputStream
,或LinkedHashSet<Byte[]>
,或任何东西作为一个类型参数.
当你这样看时,很容易理解为什么这个成语如此常见.