如何在java中使用一个函数来创建一个接口,该函数接受扩展接口类型的参数?

如何在java中使用一个函数来创建一个接口,该函数接受扩展接口类型的参数?,java,interface,Java,Interface,如何在java中使用一个函数来创建一个接口,该函数接受扩展接口类型的参数 例如,以接口ISelfComparable为例 如果类A扩展了它,那么我希望它能够实现 bool compareTo(A other) bool compareTo(B other) 但是如果类B扩展了它,那么我希望它能够实现 bool compareTo(A other) bool compareTo(B other) 我知道我可以使用泛型接口,但它似乎不正确,因为扩展ISELFBI没有任何意义 如果这是不可能的

如何在java中使用一个函数来创建一个接口,该函数接受扩展接口类型的参数

例如,以接口ISelfComparable为例

如果类A扩展了它,那么我希望它能够实现

bool compareTo(A other)
bool compareTo(B other)
但是如果类B扩展了它,那么我希望它能够实现

bool compareTo(A other)
bool compareTo(B other)

我知道我可以使用泛型接口,但它似乎不正确,因为扩展ISELFBI没有任何意义


如果这是不可能的,那么这种情况下的最佳实践是什么?

通常的解决方案是自约束泛型,如
Enum
类中所示

interface Example<T extends Example<T>> {
    void foo(T t);
}

public class ExampleImpl implements Example<ExampleImpl> {
    @Override
    public void foo(ExampleImpl example) {
    }
}
接口示例{
void foo(T);
}
公共类ExampleImpl实现示例{
@凌驾
公共void foo(示例impl示例){
}
}
它的工作原理有点令人头晕目眩,但举例来说解释得很好。关于这个问题也有一个很好的答案

请注意,它不是万无一失的,因为它允许:

public class ExampleImpl2 extends Example<ExampleImpl {
    @Override
    public void foo(ExampleImpl example) {

    }
}

公共类ExampleImpl2扩展示例看看类
java.lang.Comparable
:它有一个参数,该参数具有可用于int
compareTo
的对象类型

以此类推:

public interface ISelfComparable<T extends ISelfComparable<T>> {
    boolean compareTo(T other);
}
公共接口是可比较的{
布尔比较器(T其他);
}

有一种方法可以检查参数的类型,但只能在运行时检查。例如,您可以在默认方法中实现类型检查:

interface ISelfComparable {
    default boolean compareTo(ISelfComparable param) {
        if (this.getClass() != param.getClass()) {
            throw new IllegalArgumentException();
        }
        ...
    }
}
然后,此接口的每个实现应如下所示:

class A implements ISelfComparable {
    @Override
    public  boolean compareTo(ISelfComparable param) {
        ISelfComparable.super.compareTo(param);
        ...
    }
}

在这种情况下,如果调用
newa().compareTo(newb())
然后将抛出
java.lang.IllegalArgumentException
,如果B也是自可比的,或者我不理解您的意思,这将仍然允许A扩展ISelfComparable。“我知道我可以使用通用接口,但它似乎不正确,因为A扩展ISelfComparable没有任何意义”。。。。什么?A将是
类A实现ISELFComable
,B将是
类B实现ISELFComable
。。。你从哪里知道A通过B?或者你想阻止A通过B?那么你应该这么说。因为就我所知,理论上A可以扩展IselfComparables,因此它需要运行时检查才能完全确定。例如,你可以尝试
System.out.println(“this:+this.getClass().getSimpleName()+”-->other:+other.getClass().getSimpleName())在你的
foo
方法中,看看你如何从那里走下去。Mhh,似乎并不能解决OPs问题。当我创建
类ExampleImpl2实现示例
时,我可以将
类ExampleImpl
更改为
类ExampleImpl实现示例
,而这正是OP想要阻止的。@Tom确实没有。好了,在Java类型的系统中没有办法表达这个确切的需求,这是你能得到的最接近的,这也是我假设的。OP需要检查传递的
示例
对象的运行时类型是否与
完全匹配才能完全确定。此主题上的规范SO线程可能是。
可比
没有OP喜欢应用的限制。还可以看到另一个答案,它表明您的自约束泛型也不能满足该要求。