2016-05-07 13 views
3

私はジェネリックスを初めて使用しています。私は以下の構文からわかるように、VはTと同じかサブクラスであるべきですが、これはコンパイルエラーを表示せず、Tが文字列配列のときVが整数であってもFalseを返します。Generics、V extends T、互換性のない型の場合でもエラーなし

class GenMethDemo { 

    public static <T ,V extends T> boolean isIn(T x, V[] y) { 

     for (int i =0; i< y.length; i++) 
      if (x.equals(y[i])) return true; 
     return false; 

    } 
} 



public class App { 

    public static void main(String[] args) { 

     String b[] = {"are", "how", "YOU"}; 

     System.out.println(GenMethDemo.isIn(1, b)); 

    } 

} 

しかし、私は行動が期待されているよう<T extends Comparable<T>, V extends T><T,V extends T>を交換した場合。 Javaの5/6/7で

+4

この場合、 'T'は' Object'として扱われるので、 'String []'はうまくいきます。 –

+0

次に、ジェネリックの使用は何ですか?強い型の安全のためではありません。 ? – garg10may

+0

少なくとも実行時には、これはTが整数になっているので、エラーを示しているはずです。また、なぜComparableインターフェースを使用するとエラーになるのでしょうか。文字列と整数の両方が同等です。 – garg10may

答えて

6

、明示的Objectに最初の引数をキャストしない限り、このような一般的な方法にVとしてTStringとしてIntegerを渡すと、「バウンド不一致」コンパイルエラーが発生します。 improved type inferenceへのJava 8で

、提供引数のTVの関係を満たすように、Tはエラーを得ていない、VStringであることを可能にする、? extends Objectとして推定されます。

あなたは<T extends Comparable<T>, V extends T>に制限した場合、Tは、可能な限り広いタイプComparable<Integer>に陥った場合、それはStringのスーパータイプではありませんIntegerString --evenを満たすことができなタイプTVのないような組み合わせはありません。したがって、期待どおりコンパイルエラーが発生しています。

関連する問題