0

Java のジェネリックについて基本的な質問があります。別のクラス T によってインスタンス化されたクラス X があります。使用されるすべてのクラス T には、methodOfT() と呼ばれるメソッドがあります。ただし、Java は obj と methodOfT() を認識していないため、コンパイラの時間エラーが発生します。

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

この問題を回避するために、別のクラス 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)
{
}

この場合、上記の解決策は失敗します。誰かが助けてくれますか。

4

1 に答える 1

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);
     }  
}
于 2012-05-04T08:11:09.720 に答える