2012-05-04 8 views
0

Javaのジェネリックに関する基本的な質問があります。 私は別のクラスTによってインスタンス化されるクラスXを持っています。使用されるすべてのクラスTにmethodOfT()というメソッドがあります。しかし、JavaはobjとmethodOfT()を知らないのでコンパイラの時間エラーが発生します。Java汎用コールタイプの変数タイプ

この問題を回避するために、私は別のクラスXSuperを定義しました。 Xをインスタンス化するすべてのクラスは、このXSuperクラスを拡張します。これはコンパイル時のエラーを取り除き、私が望むものを達成できるようにします。

public abstract class XSuper 
{ 
    public abstract void methodOfT(); 
} 

public class UserOfX extends XSuper 
{ 
    X<UserOfX> objX = new X<UserOfX>(); 
    public void methodOfT() 
    { 
    } 
} 

しかし、私はこのことをよりクリーンな方法で行いたいと思っています。クラスUserOfXを別のクラスから派生させたいからです。もう一つの問題は、私はとmethodOfT()メソッドを定義したいことをされた - この場合

public methodOfT(T objOfT) 
{ 
} 

、上記の解決策は失敗します。誰か助けてもらえますか?

答えて

3
public class X<T> 
{ 
    T obj; 
    public void methodOfX() 
    { 
      obj.methodOfT(); 
    } 
} 

コンパイラは、Tが何であるかをオブジェクトが評価されているかどうかわかりません。オブジェクトにmethodOfTメソッドがないため、コンパイルが失敗します。ここではそれを解決する方法は次のとおりです。この場合

public interface SomeInterface{ 
    void methodOfT(); 
} 
public class X<T extends SomeInterface> 
{ 
    T obj; 
    public void methodOfX() 
    { 
      obj.methodOfT(); 
    } 
} 

、コンパイラが提供されたTがインタフェースSomeInterfaceを実装し、ひいては方法methodOfTを持っていることを知っています。答えを

public interface SomeInterface<X>{ 
    void methodOfT(X object); 
} 
public class X<T1, T2 extends SomeInterface<T1>> 
{ 
    T1 obj1; 
    T2 obj2; 
    public void methodOfX() 
    { 
      obj2.methodOfT(obj1); 
    } 
} 
+0

ありがとう:あなたの追加要件を考えると(あなたはまた、クラスの代わりにインターフェイスを使用することができますが、それはあまりエレガントです)

、我々はトンこのコードいくつかのより多くを変更する必要がありますつもりです。しかし、私がこのメソッドを 'obj.MethodOfT(T anotherObjOfT)' – Raj

+0

@RajTendulkarにしたい場合、この解決策は失敗すると言っていたので、私はそのインターフェースを汎用的にする必要があります。 –

+0

これは役に立ちます!どうもありがとうございました。 – Raj