2016-03-20 8 views
0

私はこの数日間、この問題に頭を悩ませていました。独自の戻り値型でインターフェイスを呼び出すときのJava型の不一致?

私はインターフェイスを介して別のクラスとやりとりするクラスを持っています。私は十分に簡単なコードでいくつかの型不一致エラーが発生しています。

public class FooBar { 
    Foo<? extends Bar> X = new Y(); 

    public void test(){ 
    if X.isA(X.B()){ 
     //do something; type mismatch here 
    } 

    } 
} 

インタフェース:

public interface Foo<T extends Bar> { 
    public T B(); 
    public boolean isA(T t); 
} 

実装:問題の

public class Y implements Foo<T extends Bar> { 
    public int B(){ 
    return 5; 
    } 

    public boolean isA(int num){ 
    int A = 10; 
    return (A == num) ? true : false; 

} 

私のポイントは、メソッドのテスト(あります)。私はインターフェイスを介して番号を取得して、それから実装クラスの同じインスタンスでテストしますが、これは私にキャプチャ/タイプの不一致エラーを与えています。

CAP#1のキャプチャからバーを延長します。拡張バー

CAP#2のキャプチャからバーを拡張? extend Bar

私は検索で見つかった多くのことを試しましたが、それらのどれも働いていません。ジェネリックとインターフェイスは私には新しく、私はまだそれらを学んでいます。事前に助けてくれてありがとう!

+3

は 'isA'ではなく、' int'の 'T'を取るべきではないでしょうか。または、クラスの署名が 'public class Y implements Foo ' –

+1

に変更されました。 '戻り値(A == num)? true:false; '単純に' return A == num; ' – Guy

+0

Barクラスはどこですか? – pczeus

答えて

0

クラスを更新しました(分かりやすくするため、欠落しているBarクラスを追加しました)。 あなたは今FooBar.main()方法を実行して、あなたが期待する結果を得ることができます:

public class FooBar { 
    Foo x = new Y(); 

    public void test(){ 
     if(x.isA(x.B())){ 
      System.out.println("x.isA!"); 
     } 
    } 

    public static void main(String... args){ 
     FooBar fb = new FooBar(); 
     fb.test(); 
    } 
} 

public interface Foo<T extends Bar> { 
    T B(); 
    boolean isA(T t); 
} 

public class Bar {} 

public class ExtendsBar extends Bar { 

    @Override 
    public String toString(){ 
     return "Yes I extend Bar"; 
    } 
} 

public class Y implements Foo<ExtendsBar> { 
    public ExtendsBar B() { 
     return new ExtendsBar(); 
    } 

    public boolean isA(ExtendsBar num) { 
     return (num instanceof Bar); 
    } 
} 
関連する問題