繁体   English   中英

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

[英]How can i make an interface in java with a function that accepts a parameter of the type that extends the interface?

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

以接口 ISelfComparable 为例

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

bool compareTo(A other)

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

bool compareTo(B other)

我知道我可以使用通用接口,但它似乎不正确,因为 A 扩展 ISelfComparable<B> 没有任何意义

如果这是不可能的,在这种情况下的最佳做法是什么?

通常的解决方案是自有界泛型,如Enum类中所示。

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

public class ExampleImpl implements Example<ExampleImpl> {
    @Override
    public void foo(ExampleImpl example) {
    }
}

它的工作原理有点令人眼花缭乱,但例如在这里解释得很好。 也有关于这个问题的一个很好的答案在这里

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

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

    }
}

但在实践中,self-bounded 成语用于准确表达您所追求的事物。

如果您真的,真的,真的需要参数对象始终与this完全相同,则必须进行运行时检查。 (它还提出了为什么你需要这个的问题,但这会让我们偏离主题。)

看看类java.lang.Comparable :它有一个参数,可以使用 int compareTo的对象类型。

类推:

public interface ISelfComparable<T extends ISelfComparable<T>> {
    boolean compareTo(T other);
}

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

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);
        ...
    }
}

在这种情况下,如果您调用new A().compareTo(new B()); 然后会抛出java.lang.IllegalArgumentException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM