我怎样才能使接口实例方法只接受同一个类的参数,真的吗?

这个SO讨论提出以下习语:

public interface IComparable<T extends IComparable> { int compare(T t); } 

然后允许:

 public class Foo implements IComparable { public int compare(Foo foo) { return 0; } } 

但是,这个习惯用法不仅仅包括以上代码,因为下面的代码也可以编译:

 class A implements IComparable { public int compare(A a) {return 0;} } public class Foo implements IComparable { public int compare(A a) { return 0; } } 

因此(除非我误解了一些东西)原始的成语并没有真正购买任何东西,而不是那么戏剧化:

 public interface IComparesWith { int compare(T t); } public class A implements IComparesWith { public int compare(A a) {...} } 

那么,有没有办法实际声明一个接口,以便任何类声明实现它有一个方法来比较自己的类的对象,没有任何漏洞,如上面的那个?

我显然无法将上述内容发布为评论,因此我创建了一个新post。

你是对的:这个习惯用法不会阻止类与不同的类进行比较。 它所做的只是确保比较对象也实现相同的接口。 如果只需要比较相同类型,则可以由实现类强制执行。

你称之为“ 漏洞 ”的是我所谓的“ 故意做你不想做的事情 ”。

如果需要这样的行为,可以将Foo对象与A对象进行比较。

这是一个function,而不是漏洞。

如果你想让Foo与其他Foos相媲美,你应该定义Foo来实现IComparable

如果您希望FooA相媲美,那么您不应该定义Foo来实现IComaparable 。 为什么有人会这样做,除非他们故意写破坏的代码?

问题的实际答案已由@caskey提供:

不,你不能用Java中的接口做你想做的事。[你必须用类来做)。

有一件事你错过了:

因此(除非我误解了一些东西)原始的成语并没有真正购买任何东西,而不是那么戏剧化:

public interface IComparable

原来的成语会给你买点东西。 它强制比较对象必须实现IComparable 。 不那么引人注目的例子允许您无限制地将实现类与任何对象进行比较。 所以……编译器允许你指定Long ,或InputStream ,或LinkedHashSet ,或者任何东西作为类型参数。

当你以这种方式看待它时,很容易理解为什么这个成语如此常见。

不,这样的限制是不可能的写的generics。 您的评估对我来说似乎是对的。

因此(除非我误解了一些东西)原始的成语并没有真正购买任何东西,而不是那么戏剧化:

它确实买了东西,但它与你想到的不同。 当有人写道时,99.9%的时间并不是他们想买的东西。

那么,有没有办法实际声明一个接口,以便任何类声明实现它有一个方法来比较自己的类的对象,没有任何漏洞,如上面的那个?

不。因为它在类型安全方面没有用。 public class Foo implements IComparable没有什么问题public class Foo implements IComparable – 它是完全类型安全的 。 如果有人想要以某种方式制作一个可以安全地与A比较的Foo ,那就太棒了。 我同意jahroy的回答 – 这不是“漏洞”; 这是一个function。 为什么使它更通用,只要它是安全的? 它不会妨碍你正在做的任何事情。 如果你想让你所有的课程与自己比较,那也没关系。 一切都很好,只要它的类型安全。

您应该关注类型与实现IComparable的类型参数之间关系的唯一地方是您使用它的地方,因为该地点可能合法地需要这种关系。 因此,在那个地方(通过可比类型参数化的generics类或generics方法),我们可以轻松地绑定代表类似类型的类型变量,如下所示: T extends IComparable T extends IComparable ,让我们保证T可以与自己相比。

不要使用generics:

 public interface Foo { public void doSomething(Foo foo); } 

确实。 我主张我们使用This作为此类型参数的常规名称

 public interface IComparesWith { int compare(This t); } 

我之前的回答: 编写指向其实现者的通用接口的便捷方式