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

java在抽象方法中返回抽象类,java,interface,abstract-class,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); } 它只是n个

我对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);
}

它只是n个坐标向量的加法,我怎么能返回结果呢?我想在将来使用子类(如2dVector或3dVector?

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

的实现。您不能直接创建抽象对象-您需要具体的类或重写抽象定义的所需方法

像这样的东西可能就是你想要的

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 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 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);
    }
}