Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能使接口实例方法只接受同一类的参数呢?_Java_Generics_Interface - Fatal编程技术网

Java 我怎样才能使接口实例方法只接受同一类的参数呢?

Java 我怎样才能使接口实例方法只接受同一类的参数呢?,java,generics,interface,Java,Generics,Interface,这就提出了以下习语: public interface IComparable<T extends IComparable<T>> { int compare(T t); } 公共接口i可比较{ int比较(T); } 然后允许: public class Foo implements IComparable<Foo> { public int compare(Foo foo) { return 0; } } 公共

这就提出了以下习语:

public interface IComparable<T extends IComparable<T>> {
    int compare(T t);
}
公共接口i可比较{
int比较(T);
}
然后允许:

public class Foo implements IComparable<Foo> {
    public int compare(Foo foo) {
        return 0;
    }
}
公共类Foo实现了IComparable{
公共整数比较(Foo-Foo){
返回0;
}
}
但是,由于以下代码也可以编译,因此此习惯用法允许的不仅仅是上述内容:

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;
    }
}
A类实现了IComparable{
公共int比较(A){返回0;}
}
公共类Foo实现了IComparable{
公共整数比较(A){
返回0;
}
}
因此(除非我误解了什么),与远没有那么戏剧化的成语相比,最初的成语其实买不到更多的东西:

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

public class A implements IComparesWith<A> {
    public int compare(A a) {...}
}
公共接口IComparesWith{
int比较(T);
}
公共类A实现IComparesWith{
公共整数比较(A){…}
}
那么,有没有一种方法可以真正声明一个接口,使得任何类声明来实现它时,都有一个方法可以与它自己的类的对象进行比较,而不存在上述漏洞呢

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

不要使用泛型:

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

不,对于编写的泛型,这种限制是不可能的。你的评估对我来说似乎是正确的。

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

public interface IComparesWith<This> 
{
    int compare(This t);
}
公共接口IComparesWith
{
int比较(这是t);
}

我以前的回答是:

你是对的:这个习语并不妨碍将类与不同的类进行比较。它所做的只是确保比较对象也实现相同的接口。如果需要只比较相同的类型,则可以由实现类强制执行

你所说的“漏洞”就是我所说的“故意做你不想做的事”

如果需要此类行为,则可以将Foo对象与对象进行比较

这是一个特点,不是漏洞

如果希望Foo与其他Foo具有可比性,那么应该定义Foo来实现
IComparable

如果不想让Foo与A相比较,那么不应该定义Foo来实现
icomaprable
。为什么有人会这样做,除非他们是故意写坏代码的

@caskey已经提供了您问题的实际答案:

不,您不能使用Java中的接口来做您想做的事情。[您必须使用类来做]

你错过了一件事:

因此(除非我误解了什么),与远没有那么戏剧化的成语相比,最初的成语其实买不到更多的东西:

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

public class A implements IComparesWith<A> {
    public int compare(A a) {...}
}
公共界面i可比较

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

从这个角度看,很容易理解为什么这个成语如此普遍

因此(除非我误解了什么)原来的成语 与不那么引人注目的东西相比,真的买不到更多的东西:

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

public class A implements IComparesWith<A> {
    public int compare(A a) {...}
}
它确实买了一些东西,但它与你所想的不同。当有人这样写的时候,99.9%的时间不是他们想要买的东西

那么,有没有一种方法可以真正声明一个接口,使得 类声明要实现它,它有一个与的对象进行比较的方法 它自己的类,没有任何漏洞,如上面的一个

不,因为它在类型安全方面没有用处。
公共类Foo实现了IComparable
,它完全是类型安全的。如果有人想制作一个
Foo
,在某种程度上可以安全地与
a
进行比较,那就太好了。我同意jahroy的回答——这不是一个“漏洞”;这是一个特色。只要安全,为什么不把它做得更一般一些呢?它不会妨碍你做任何事。如果你想让你所有的课程都和自己比较,那也没关系。只要类型安全,一切都很好


您应该关心类型与类型参数之间的关系的唯一地方是使用它的地方,因为该地方可能合法地需要这种关系。因此,在那个地方(由可比较类型参数化的泛型类或泛型方法),我们可以很容易地绑定表示可比较类型的类型变量,如下所示:
T扩展IComparablet如果您不介意实现类现在可以与任何其他实现类进行比较的话,这是可行的。@ChrisHayes“可比较”是什么意思相关的标题没有提到可比性,这个答案也没有。我已经回答了前面提到的问题。我们读的是同一个问题吗?整个问题以“IComparable”为例。然而,实际的接口是不相关的。询问者想要一种方法来强制MyInterface的实现总是由类T实现,也就是说,不能将任何其他类放在其中。你的回答并不能做到这一点。正如你所说,IComoarable只是一个例子(与此无关)。我的观点是:“不要使用泛型”。我相信这就是问题所在。。。OP在不应该使用泛型的时候使用泛型。我不明白为什么这会变成这样一场圣战:如果你改变这个问题,那才是答案。正确的答案是OP想要的行为不可能通过接口实现;不能将类型泛型限制为c的类型