我的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)?
答案 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
的实现。