Java:在接口中引用“自己的类型”

时间:2016-02-22 10:15:27

标签: java generics types clone

我想在一个接口中指定一个实现方法必须返回一个自己类型的类。例如,克隆方法:

let button = UIButton(type: UIButtonType.Custom) as UIButton

现在我可以致电:

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

我想强制MyArray的所有实现者都有一个返回与实现者相同类型的克隆方法。如果有一些内置的“元类型”表示“与此类/接口相同的类型”,我可以保存很多行:

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

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

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

2 个答案:

答案 0 :(得分:1)

我认为你需要的是F-Bound类型。您可以查看this个帖子以获得类似示例。

答案 1 :(得分:1)

您需要使用泛型来实现此目标

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();

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