在java中使用接口中的实现类型

use*_*929 7 java generics interface

我想创建一个接口,强制实现它的每个类具有某个功能,用于实现的类的类型.

所以说我有类MyClassA,MyClassB,MyClassC等都需要一个自己类型的函数:

在MyClassA中:

public class MyClassA implements MyClass {
    MyClassA function(MyClassA x) {
        doSomethingImplementedInMyClassA(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

在MyClassB中:

public class MyClassB implements MyClass {
    MyClassB function(MyClassB x) {
        doSomethingImplementedInMyClassB(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如何编写接口MyClass以要求这样的功能?

public interface MyClass {
    MyClass function(MyClass x);
}
Run Code Online (Sandbox Code Playgroud)

显然不起作用,因为返回类型是MyClass而不是它的实现.如何在Java中正确地做到这一点?

SLa*_*aks 11

你可以使用泛型:

public interface MyClass<V extends MyClass<V>> {
    V function(V x);
}

public class MyClassA implements MyClass<MyClassA> 
Run Code Online (Sandbox Code Playgroud)

这称为CRTP.


这并不完美; 它仍然会允许这样的事情

public class MyClassB implements MyClass<MyClassA> 
Run Code Online (Sandbox Code Playgroud)

要正确地执行此操作,您需要更高级的类型[需要引用],Java不支持.