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();
这会编译得很好,但显然应该在运行时失败。
我想在一个接口中指定一个实现方法必须 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();
这会编译得很好,但显然应该在运行时失败。