2017-10-02 20 views
0

私はjavaのインターフェイスと抽象クラスでいくつかの問題があります。 私が持っているインタフェース、このような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:私は結果を返すことができますどのように、n個の座標とベクトルの

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

そのわずか加え、?私は子供のクラス(2dVectorや3dVectorのような)を将来使用したいですか?

+1

なぜ生のタイプを使用しますか?あなたがいなければ、あなたはすでにあなたの答えを持っています。 – Tom

+0

[ジェネリックでオブジェクトサブクラスを返す]の可能な複製(https://stackoverflow.com/questions/3284610/returning-an-objects-subclass-with-generics) – Tom

答えて

3

抽象オブジェクトを直接作成することはできません。抽象クラスによって定義された必須メソッドを具体的なクラスまたはオーバーライドする必要があります。

このようなものは、あなたが探しているものかもしれません。あなたのコードでpublic abstract class Vector implements IVectorを使用すると、Raw Typesを紹介し、避けるべきであることを

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

抽象クラスをインスタンス化することはできません。また、インタフェースを使用することもできません。 Vectorのサブクラスか、IVectorの実装を返す必要があります。