4

私の Java コンパイラjavac 1.6.0_37は、次の小さなプログラムのコンパイルに失敗します。

import java.util.*;

public class QueueTest {
    public static void main( String args[] ) {
        Queue<String> q = new LinkedList<String>();
    }
}

エラーメッセージは次のとおりです。

QueueTest.java:5: incompatible types
found   : java.util.LinkedList<java.lang.String>
required: Queue<java.lang.String>
        Queue<String> q = new LinkedList<String>();
                          ^
1 error

ドキュメントによると、LinkedList<E>実装Queue<E>し、これはコンパイルする必要があります。でこのコードをコンパイルできましたjavac 1.5.0_08。また、ジェネリックを外しても問題は変わりません (ジェネリックがなくてもコンパイルされません)。

私の質問は、これがバグではないという立場を擁護する人はいますか?

4

3 に答える 3

4

それは私のためにコンパイルされます。

唯一の結論は、それ以外のQueueクラスをインポートしたか、それ以外をjava.util.Queueインポートしたか、またはその両方であるということです。LinkedListjava.util.LinkedList

于 2012-12-08T23:35:48.460 に答える
3

明示的にやってみてください:

java.util.Queue<String> q = new java.util.LinkedList<String>();

それを使用してインポートするとオーバーライドされる傾向があることに注意してくださいpackage.*(明示的にインポートした、または作業パッケージに同じ名前のクラスがある場合):

ドキュメントから:

n という名前の型をインポートするパッケージ p のコンパイル単位 c の単一型インポート宣言 d は、次の宣言をシャドウします。

any top level type named n declared in another compilation unit of p.
any type named n imported by a type-import-on-demand declaration in c.
any type named n imported by a static-import-on-demand declaration in c.

ここにあるのは、オンデマンド型インポート宣言であり、単一の型インポート宣言によって隠されています

于 2012-12-08T23:37:02.043 に答える
2

Java 1.6.0.31 を使用して ideone で正常にコンパイルされるため、他のバグがあるに違いありません。

import java.util.*;

class QueueTest {
    public static void main( String args[] ) {
        Queue<String> q = new LinkedList<String>();
    }
}

クラスパスに、JDK をオーバーライドしている、java.util.Queueまたはオーバーライドしている別のクラスがありますか?java.util.LinkedList

于 2012-12-08T23:35:15.213 に答える