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

有没有办法说“这个方法返回this ”使用generics?

当然,我想在子类中重写此方法,因此声明应该与@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; } } 

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

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

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

编辑:oxbow_lakes的答案确实提供了在大多数情况下都会起作用的东西,但我相信有些方法可以欺骗它,以至于你实际上处理的是另一种类型。 (无论如何,从实验的记忆中。)请注意,这与Java枚举的工作方式类似。

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

 public interface Addable> { public This add(T t); } 

现在声明一个间接级别 – 一个“模板”类

 public interface ListTemplate> extends Addable{ } public interface List extends ListTemplate> { } 

然后List的实现必须从add方法返回一个List (我将让你填写impl细节)

 public class ListImpl implements List { public List add(A a) { return ... } } 

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

使用协变类型应该简单如下:

 abstract class Foo { Foo get() { return this.getClass().cast(this); } } class Bar extends Foo { @Override Bar get() { return (Bar) super.get(); } }