有没有办法在Java中说"方法返回这个"?

Aar*_*lla 5 java generics

有没有办法this用泛型来说"这个方法返回"?

当然,我想在子类中重写此方法,因此声明应该可以正常使用@Override.

这是一个例子:

class Base {
    public Base copyTo (Base dest) {
        ... copy all fields to dest ...
        return this;
    }
}
class X extends Base {
    @Override
    public X copyTo (X dest) {
        super.copyTo (dest);
        ... copy all fields to dest ...
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

public <T extends Base> T copyTo (Base dest)根本不起作用:我得到"类型不匹配:无法从Base转换为T".如果我用强制转换强制它,则覆盖失败.

oxb*_*kes 5

你可以做一些非常聪明的事情(类似于他们在Scala中使用2.8集合框架所做的事情).声明一些应该返回"本身"的接口方法(注意: This是一个类型参数,而不是关键字!)

public interface Addable<T, This extends Addable<T, This>> {
   public This add(T t);
}
Run Code Online (Sandbox Code Playgroud)

现在声明一个间接级别 - 一个"模板"类

public interface ListTemplate<A, This extends ListTemplate<A, This>> 
    extends Addable<A, This>{
}

public interface List<A> extends ListTemplate<A, List<A>> {
}
Run Code Online (Sandbox Code Playgroud)

然后一个实现List必须Listadd方法返回一个(我会让你填写impl细节)

public class ListImpl<A> implements List<A> {

    public List<A> add(A a) {
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)

类似地,你可以声明a SetTemplate和a Set来扩展Addable接口 - 其add方法将返回一个Set.很酷,对吧?


Jon*_*eet 4

不,没有办法表达这一点。只需声明返回类类型的方法即可。Java 具有协变返回类型,因此您可以重写方法以返回更具体的类型。

如果您想对此有一些标记,您可以随时引入自己的注释 - 但不要指望任何其他工具会特别注意它。

编辑:oxbow_lakes 的答案确实给出了在大多数情况下都有效的东西,但我相信有一些方法可以欺骗它,这样你实际上正在处理不同的类型。(无论如何,来自实验的记忆。)请注意,这与 Java 枚举的工作方式类似。