Java: 界面中引用"own type"

Java: Reference "own type" in interface

我想在一个接口中指定一个实现方法必须 return 一个属于它自己类型的 class。比如克隆方法:

interface MyArray{
    MyArray clone();
}

interface MyVector extends MyArray{
    // ... 1d-array specific methods
    MyVector clone();
}

class MyDoubleVector implements MyVector{
    //...
    @Override
    public MyDoubleVector clone(){
        //...
        return new MyDoubleVector(Arrays.copyOf(data));
    }
}

现在我可以打电话了:

MyVector vec1 = new DoubleVector(...);
MyVector vec2 = vec1.clone();

我想强制 MyArray 的所有实现者都拥有一个 return 与实现者类型相同的克隆方法。如果有一些内置的 "meta-type" 代表 "same type as this class/interface",我可以节省很多行,比如:

interface MyArray{
    <ArrayOfSameType> clone();
}

并且不必重新定义扩展接口中的方法来调用 vec1->vec2 克隆操作,如上所示。

Java 是否有一些内置构造来执行此操作,或者复制和粘贴大量样板代码只是 java 程序员的悲惨命运?

我觉得你需要的是F-Bound类型的。您可以查看 this 线程以获取类似示例。

你需要使用泛型来实现这个

interface MyArray<A extends MyArray<A>> {
    A clone();
}

interface MyVector<A extends MyVector<A>> extends MyArray<A> {

}

class MyDoubleVector implements MyVector<MyDoubleVector> {
    //...
    @Override
    public MyDoubleVector clone(){
        //...
        return new MyDoubleVector(Arrays.copyOf(data));
    }
}

为了澄清一点,您需要 extends MyArray<A> 来防止开发人员编写以下内容。

MyArray<Integer> mi = new SomeMyArray<>();
Integer i = mi.clone();

这会编译得很好,但显然应该在运行时失败。