2017-07-06 5 views
-2

こんにちは私は、誰かが私に詳細な方法で答えを説明することができれば、非常に感謝する一般的なインターフェイスでこの質問があります。汎用インターフェースが拡張されますか?

intefaceをI

public interface I <T> { 
void f (T a); 
} 

インタフェースJ

public interface J <T extends I<T>>{ 
    void g(T b); 
} 

クラス

public class A<T> implements J<T>{ 
    public void g(T b) { 

    } 
} 

クラスAのコードでエラーが発生します。 エラーが発生する理由を教えてください。

クラスAは

public class A<T extends I<T>> implements J<T>{ 
    public void g(T b) { 

    } 
} 

を修正し、このコードは、エラーを修正し、なぜ誰かが私に説明できますか?あなたのTが実装/ I<T>を拡張していないため、事前

答えて

2

おかげでこれがあります。

同じ汎用プレースホルダを使用することはしばしば混乱します。

public interface I<TI> { 
    void f(TI a); 
} 

public interface J<TJ extends I<TJ>> { 
    void g(TJ b); 
} 

// Error:(17, 37) java: type argument TA is not within bounds of type-variable TJ 
// i.e. This `TA` does NOT implement/extend J<TA extends I<TA>> 
public class A<TA> implements J<TA> { 
    public void g(TA b) { 

    } 
} 

// Works fine because `TB extends I<TB>` 
public class B<TB extends I<TB>> implements J<TB> { 
    public void g(TB b) { 

    } 
} 
0

理由はJ <T extends I<T>>あるので、あなたは、このインターフェイスを実装するときにI.を拡張しかし、あなたはこのA<T> implements J<T extends I<T>>ようにそれを書き込むことはできませんクラスTとそれを提供する必要があります。このようにそれを見て試してみてください。

まず:J<T> extends I<T>からJ <T extends I<T>>変更私はそれはそれはそれで、私が変わってしまうことはあるクラスT.

のための不必要な要件を作成しますので、あなたが望んだものではないことを推測します。今、あなたはJのためのより単純な型を持っています。そして、これはあなたが必要としている/とにかく望んでいると思います。

2番目:すべてのメソッドfi(Tx)とfj(Tx)を実装する必要があります。

これはどのように実行されるかの実例です。シンプルで働きます。

public class MyClass { 

    public static void main(String[] args) throws Exception { 
     A a = new A<String>(); 
     a.fi("foo"); 
     a.fj("bar"); 
     return; 
    } 

    public interface I<T> { 
     void fi(T t); 
    } 

    public interface J<T> extends I<T> { 
     void fj(T t); 
    } 

    public static class A<T> implements J<T> { 
     // it is static only to be accessible from main() 
     public A() { 
      // default constructor 
     } 

     public void fi(T t) { 
      System.out.println("method from I, arg=" + b.toString()); 
     } 

     public void fj(T t) { 
      System.out.println("method from J, arg=" + b.toString()); 
     } 
    } 
} 

出力:

method from I, arg=foo 
method from J, arg=bar 
関連する問題