java在抽象方法中返回抽象类
我对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个
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);
}
}