使用扩展名覆盖方法的签名

时间:2014-02-11 23:08:10

标签: java android java-ee

我有以下情况:

通用界面

public interface AbstractObject {
  ...
}

扩展界面的一些特定类

public class RealObject implements AbstractObject {
  ...
}

public class TrueObject implements AbstractObject {
  ...
}

通用抽象类:

public abstract class AbstractManager extends OtherManager {

  public abstract AbstractObject get(AbstractObject obj);
  public abstract AbstractObject put(AbstractObject obj);

}

我需要一个扩展AbstractManager的类,并使用AbstractObject类的扩展来实现它的方法,如下所示:

public class ConcreteManager extends AbstractManager {

  @Override
  public TrueObject get(TrueObject trueObj){
    ...
  return tobj;
  }

  @Override
  public TrueObject put(RealObject realObj2){
    ...
  return tobj;
  }

}

可能吗?

3 个答案:

答案 0 :(得分:0)

不是你写的方式。请记住,你必须能够在任何可以使用超类的地方使用子类的实例,因此子类的返回类型必须至少与超类一样具体(你在这里很好),并且它的参数类型必须最多特定于超类(这是你的问题)。使用AbstractManager的代码需要能够将任何旧AbstractObject传递给getput,因此您无法在ConcreteManager中要求更具体的内容。

Java Generics提供了一种“定制”特定类型接口的方法;例如,请参阅像List这样的集合类型。这有点棘手,可能会或可能不值得额外的复杂功能,具体取决于您的具体用例。

答案 1 :(得分:0)

覆盖方法时可以缩小方法的返回类型,但不能缩小参数的类型。

解决方案是使您的类具有通用性,因此您可以使用泛型指定方法参数的类型。

将通用类型参数添加到抽象类中。

public abstract class AbstractManager<
        T1 extends AbstractObject, T2 extends AbstractObject>
        extends OtherManager
{
    public abstract T1 get(T1 obj);
    public abstract T1 put(T2 obj);
}

然后,您可以指定子类中的T

public class ConcreteManager extends AbstractManager<TrueObject, RealObject>
{
    @Override
    public TrueObject get(TrueObject trueObj) {/* Implementation */}
    public TrueObject put(RealObject realObj2) {/* Implementation */}
}

答案 2 :(得分:0)

我会用一种方法和 instanceof 运算符

来编写它
public class ConcreteManager extends AbstractManager {
    public AbstractObject get(AbstractObject trueObj) {
        if(trueObj instanceof TrueObject) {
            return trueObj;
        } else if(trueObj instanceof RealObject) {
            return trueObj;
        } else {
            // type unknown
            return null; 
        }
    }
}

泛型更复杂,在这里不需要。