2011-04-06 80 views
2

我想重写一个方法,并用它的子类替换它所需的参数。抽象类A <T extends A>有没有更好的解决方案?

对于返回类型,没有问题,因为它们不是方法签名的一部分,可以用子类(称为“协变返回类型”)替换。对于论点来说,这是行不通的,因为它们是签名的一部分。

于是我想出了解决方案,使用相同类型的泛型参数:

public abstract class A<T extends A> { 

    public void loadValuesFrom(T source) { 
    ... 
    } 

} 

public class B extends A<B> { 

    public void loadValuesFrom(B source) { 
    super.loadValuesFrom(source); 
    ...  
    } 

} 

但声明“公共抽象类A”看起来很奇怪我。还有其他方法可以实现吗?任何“协变参数类型”? :-)

回答

1

如果它必须是参数类型,使用泛型可能是最好的选择。我只是做了小幅调整,以避免在类声明的原始类型:

public abstract class A<T extends A<T>> { 

然而,如果您拥有的对象初始化需要被刚创建的特殊情况下,你可能包括的方法创作,从而消除了将该对象作为参数传递的需要:

public abstract class A { 
    public A clone() { 

    } 
} 

public class B extends A { 
    public B clone() { 
     // copy state 
    } 
} 
相关问题