2011-08-10 15 views
3

ジェネリック医薬品と静的メソッド:もちろんは、Java、私は補間可能インタフェースの実装クラスのインスタンス間を補間することができ、一般的な補間クラスがしたい

interface Interpolatable { 
    int getDimension(); 
    Iterator <? extends Interpolatable> getIterator(double d); 
} 

class Coordinate extends AnotherClass implements Interpolatable { 
    public int getDimension() {return 3;} 
    public Iterator <Coordinate> getIterator (double d) {…} 
} 

class Interpolator <T extends Interpolatable> { 
    Interpolator() { 
    int dim = T.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = T.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

は、コンパイラはおよそT.getDimension()T.getIterator(d)を文句:

静的でないメソッドgetDimension()/ getIterator(double)を、Interpolatable型から静的に参照することはできません。

しかし、2つの方法はインターフェイスで定義されているため、静的にすることはできません。 Interpolatorで使用するときは、Coordinate(またはInterpolatable)のインスタンスがありません。

提案がありますか?

は(インタフェースメソッドが静的であることができない理由を私は理解して、私はエレガントに、このような問題を解決するためにどのようなアイデアを欠いている。)

+1

あなたのコードは 'static'キーワードを使用していません - コードを正しく投稿したことを確認できますか? – Bohemian

+0

@Bohemian彼はインスタンスからではなく、タイプ(クラス)自体(v.g.、T.getDimension())からメソッド.getIteratorまたは.getDimensionを使用しています。 – SJuan76

答えて

4

タイプ消去のため、実行時にジェネリックタイプではあまり効果がありません。あなたは周りのインスタンスまたはクラスオブジェクトを維持する必要があります。

class Interpolator <T extends Interpolatable> { 
    private final T target; 

    Interpolator (T target) { 
    this.target = target; 
    int dim = target.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = target.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 
+0

+1 IMHOこのアプローチは最も単純でクリーンです。コンストラクタに余分なパラメータが必要です。これは非公開のコンストラクタで隠されていて、きれいなAPIになる可能性があります。他のアプローチでは、メソッド... yukにダミーインスタンスパラメータが必要です。 – Bohemian

0

はあなたがclass Interpolator extends Coordinate

を言った後、ちょうどすぐにメソッドを呼び出し傾けます。 ..

+0

いいえ、別の時間のため、私は座標以外のものを補間したいと思います。 –

4

基本的には、あなたはクラスにインターフェースの任意のインスタンスを渡すことはありません。タイプ(クラス)への呼び出しを使用しています。 T.getDimension();

また、ジェネリックは必要ありません。プレーンな古いインターフェイスは、あなたが望むように動作します。

あなたがちょうどすることができます

class Interpolator { 
    Interpolable interpolable = null; 
    Interpolator (Interpolable _interpolable) { 
    this.interpolable = _interpolable; 
    } 

    void doSomething (double d) { 
    Iterator<Interpolable> it = this.interpolable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

私は...あなたはもっと、静的/インスタンスメソッドおよび他の多くの基本的なものとのインタフェースに使用する作業ジェネリック医薬品へ

0

を取得する前に、私はあなたを考えることをお勧めします」単にジェネリック医薬品を過度に浪費しますこれはうまくいくはずです:

class Interpolator { 
    Interpolatable myInterpolatable; 

    Interpolator (Interpolatable i) { 
    myInterpolatable = i; 
    int dim = i.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <Interpolatable> it = myInterpolatable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
}