2

Java 6 ではMyClassMyClass<?>は等しいと見なされていましたが、Java 7 ではそうではありません。

Java 7 では、例として、インスタンスが与えられた Hamcrest マッチャーとMyClassmatch を期待するマッチャーで問題が発生しMyClass<?>、コンパイル エラーが発生します。

no suitable method found for assertThat(MyClass,Matcher<MyClass<?>>)
[ERROR] method Assert.<T#1>assertThat(T#1,Matcher<? super T#1>) is not applicable
[ERROR] (actual argument Matcher<MyClass<?>> cannot be converted to Matcher<? super MyClass> by method invocation conversion)

変更の理由 rawtype と、指定されていない型引数を持つジェネリック型の違いは何ですか?

提案された回答は、私がここで疑問に思っていることを実際には説明していません。コメントの 1 つは、「バインドされていないワイルドカード (メソッド シグネチャなど) の使用は、問題のメソッドがジェネリックを認識しており、そのオブジェクトのジェネリック型を尊重するという約束を示している」と述べています。ここでも、それが単なる「シグナル」であれば、コンパイル時に問題が発生することはないと思います。

含まれているものや動作するものに関する情報MyClass<?>だけだと思いますが、追加情報はないので、同等と見なす必要がありますか?MyClass<?>

4

3 に答える 3

3

これは、Java 7 で修正されたコンパイラのバグに関連しているようです。

現在表示されているコンパイラ エラーは正しいものです。MyClass<?>and など、ワイルドカードを使用したジェネリック型でメソッドを呼び出しているようですMatcher<MyClass<?>>。ワイルドカード型の引数は「不明な型」を意味するため、これらの引数は実際にはMyClass<String>andMatcher<MyClass<Integer>>である可能性があることに注意してください。これは明らかに正しくありません。

生の型を使用します。たとえば、プレーンはジェネリック型チェックをMyClass オプトアウトします。これが、生の型を使用した呼び出しがコンパイルされる理由です (ただし、実行時に a で失敗する可能性がありますClassCastException)。

于 2013-05-16T06:27:52.333 に答える
1

編集

MyClassMyClass<?>Java 6では同じではありません、

このリンクを参照してください

下位互換性のために、パラメーター化された型をその生の型に割り当てることが許可されています。

MyClass<String> stringBox = new MyClass<>();
MyClass rawBox = stringBox;               // OK

ただし、生の型をパラメーター化された型に割り当てると、次の警告が表示されます。

  MyClass rawBox = new MyClass();

  // rawBox is a raw type of MyClass<T>


  MyClass<Integer> intBox = rawBox;    

// warning: unchecked> conversion

MyClassはジェネリック型ではなく、ジェネリックMyClass<?>型クラスです。つまり、MyClass別のクラスの型を含んでいます。

たとえば、Java ではよくあることですが、このようにします。

List<String> listofString = new ArrayList<String>();

ここでは、変数 listofString が List のオブジェクトであることを意味し、その内容を String タイプのオブジェクトのみに制限します。<String>ジェネリックを伝えます。

于 2013-05-16T06:02:32.610 に答える
1

ジョン・スキートが言ったように、彼らは平等であるとは見なされませんでした。私の意見では、それは正しくありません。Java 6 と Java 7 で試しても違いがわかりません - どうやってこれを試しましたか?

raw 型とジェネリック型の違いを理解するには、この投稿を見てください (「raw 型は型パラメーターとして使用するのとどう違うのですか?」までスクロールしてください): raw 型とは何ですか?これを使って?

于 2013-05-16T06:05:49.427 に答える