2009-07-07 90 views
5

有没有办法使用泛型说“此方法返回this”?有没有办法在Java中说“方法返回这个”?

当然,我想在子类中重写此方法,所以声明应该与@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 extends Base> T copyTo (Base dest)不会在所有的工作:我碰到一个“类型不匹配:不能从基地至T转换”。如果我强制强制转换,覆盖失败。

回答

4

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

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

编辑:从oxbow_lakes的答案确实会给大多数情况下工作的东西,但我相信有一些愚弄它的方法,让你实际上处理不同的类型。 (无论如何,从实验记忆来看)。请注意,这与Java枚举的工作方式类似。

+0

除了我的(当然,马丁·奥德斯基的)的方式;详细上面 – 2009-07-07 08:32:26

+0

是的,虽然有没有实现这种事情的方式没有“这个”*实际*是这个。 – 2009-07-07 08:34:21

5

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

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

现在宣布了一个间接层 - 一个“模板”类

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

public interface List<A> extends ListTemplate<A, List<A>> { 
} 

随后的List的实现必须从add方法返回一个List(我将让你在IMPL填写详细信息)

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

    public List<A> add(A a) { 
     return ... 
    } 
} 

类似地,你可以分解一个SetTemplate和一个Set来扩展Addable接口 - add方法将返回Set。很酷,嗯?

0

使用协变类型应该是简单的:

abstract class Foo<T> { 

    Foo<T> get() { 
     return this.getClass().cast(this); 
    } 
} 

class Bar extends Foo { 

    @Override 
    Bar get() { 
     return (Bar) super.get(); 
    } 
} 
相关问题