2016-05-23 10 views
1

アドバンストJavaジェネリックスの知識の初心者レベルでは相対的にスケーリングされています。私は以下のように示されている。この複数のバインドされたJavaジェネリック型を使用してインタフェースを定義する

public interface Transformer { 
<T extends String & List<String>> T transform(String input) throws    
    IOException; 
} 

私の実装クラスAのようなインターフェース何かを定義したい:私は持っていると思いますどのような

public Class A implements Transformer{ 
    .... 
    .... 

    @Override 
    public <T extends String & List<String>> T transform(String input)  throws IOException { 
    String response = "a"; 
    return response; // compilation error "Incompatible Types: Required T but found java.lang.String" 
    } 

} 

:実装クラスは、文字列の入力を渡すことができるはずですし、戻り値の型はStringまたはListです。実装クラスには、戻り値の型を自由に選択できる自由度があります。

質問: 1.コンパイルエラー "互換性のないタイプ:必須Tですが、java.lang.Stringが見つかりました"が表示されるのはなぜですか?

+0

変換メソッドの戻り値は、Stringを拡張する必要があります(Stringはfinalなので、変換できません)。List インターフェイスを実装します。私はあなたが望む何かを非常に疑っています...あなたの目標が明確になるようにあなたの質問を言い換えるべきです... –

答えて

2

私はあなたが交差の種類を誤解していると思います。

あなたが持っている手段の定義:TがString andList<String>ではなく、Stringfinalであるため、文字列List<String>と何もないので、可能ではない文字列ORList<String>は、StringList<String>を拡張することができます。

Javaは複数のインタフェースの継承をサポートしているため、1つの実装と複数のインタフェースをサポートしているため、このような定義は理にかなっています。

List<String>は0個以上の文字列を持つことができるため、メソッドをList<String>に戻すことができます。

+0

あなたの応答を感謝します。私はあなたの答えを理解しました。私はJava GenericsにTの文字列やリストをサポートするオプションがあるかどうかを実際に見ていました。それはダムかもしれないが、ドキュメントやチュートリアルを見ている。 String型の入力を受け付け、String型またはCollection型の応答を返すインタフェースを定義する方法を回避するには? – saripallivskp

+0

@ saripallivskp私が言ったように、コレクションはゼロ以上の値を持つことができます。 –

関連する問題