有没有办法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".如果我用强制转换强制它,则覆盖失败.
你可以做一些非常聪明的事情(类似于他们在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必须List从add方法返回一个(我会让你填写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.很酷,对吧?
不,没有办法表达这一点。只需声明返回类类型的方法即可。Java 具有协变返回类型,因此您可以重写方法以返回更具体的类型。
如果您想对此有一些标记,您可以随时引入自己的注释 - 但不要指望任何其他工具会特别注意它。
编辑:oxbow_lakes 的答案确实给出了在大多数情况下都有效的东西,但我相信有一些方法可以欺骗它,这样你实际上正在处理不同的类型。(无论如何,来自实验的记忆。)请注意,这与 Java 枚举的工作方式类似。