java在抽象方法中返回抽象类

时间:2017-10-02 08:53:35

标签: java interface abstract-class

我的java接口和抽象类遇到了一些问题。 我有界面

public interface IVector <T extends  IVector>{
   public IVector add(IVector vector);
   public IVector sub(IVector vector);
   public double dotProduct(IVector vector);
   public IVector scalar(double scalar);
}

abstract class是这样的:

public abstract class Vector implements IVector{
   final ArrayList<Double> coordinates;

   public Vector(ArrayList<Double> list){
      coordinates = list;
   }

   public IVector add(Vector v){
      ArrayList<Double> newCoordinates = new ArrayList<>();
      if (v.coordinates.size() == this.coordinates.size()){
         for (int i = 0; i < this.coordinates.size(); i++) {
            newCoordinates.add(v.coordinates.get(i)+this.coordinates.get(i));
         }
      }
      else return null;
      return new IVector(newCoordinates);
  }

它只是添加了带有n个坐标的向量,我该如何返回结果?我想将来使用子课程(如2dVector或3dVector)?

2 个答案:

答案 0 :(得分:3)

您无法直接创建抽象对象 - 您需要具体类或覆盖抽象定义的必需方法。

这样的事情可能就是你想要的。

public interface IVector<T extends IVector> {
    public T add(T vector);

    public T sub(T vector);

    public double dotProduct(T vector);

    public T scalar(double scalar);
}

public abstract class Vector<T extends Vector> implements IVector<T> {
    final ArrayList<Double> coordinates;

    public Vector(ArrayList<Double> list) {
        coordinates = list;
    }

}

public class AVector extends Vector<AVector> {
    public AVector(ArrayList<Double> list) {
        super(list);
    }

    @Override
    public AVector add(AVector v) {
        ArrayList<Double> newCoordinates = new ArrayList<>();
        if (v.coordinates.size() == this.coordinates.size()) {
            for (int i = 0; i < this.coordinates.size(); i++) {
                newCoordinates.add(v.coordinates.get(i) + this.coordinates.get(i));
            }
        } else return null;
        return new AVector(newCoordinates);
    }

    @Override
    public AVector sub(AVector vector) {
        return null;
    }

    @Override
    public double dotProduct(AVector vector) {
        return 0;
    }

    @Override
    public AVector scalar(double scalar) {
        return null;
    }

}

请注意,在代码中使用public abstract class Vector implements IVector会引入Raw Types,应该避免使用。请注意,我使用了public abstract class Vector<T extends Vector> implements IVector<T>

为了实现使add方法对所有Vector对象都通用的目标,您似乎需要某种形式的工厂方法。

这样的事情可能是一次公平的尝试。

public interface IVector<T extends IVector> {
    public T add(T vector);

}

public interface Factory<T> {
    public T makeNew (ArrayList<Double> coordinates);
}

public abstract class Vector<T extends Vector<T> & Factory<T>> implements IVector<T> {
    final ArrayList<Double> coordinates;

    public Vector(ArrayList<Double> list) {
        coordinates = list;
    }

    @Override
    public T add(T v) {
        if (v.coordinates.size() == this.coordinates.size()) {
            ArrayList<Double> newCoordinates = new ArrayList<>();
            for (int i = 0; i < this.coordinates.size(); i++) {
                newCoordinates.add(v.coordinates.get(i) + this.coordinates.get(i));
            }
            // Use the passed parameter as a factory.
            return v.makeNew(coordinates);
        }
        return null;
    }

}

public class AVector extends Vector<AVector> implements Factory<AVector> {
    public AVector(ArrayList<Double> list) {
        super(list);
    }

    @Override
    public AVector makeNew(ArrayList<Double> coordinates) {
        return new AVector(coordinates);
    }
}

答案 1 :(得分:0)

无法实例化抽象类:接口也不能。您必须返回Vector的子类或IVector的实现。