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>implements Queue<E>,这应该编译。我能够用javac 1.5.0_08. 此外,您可以将泛型排除在外,问题仍然存在(即使没有泛型,它也不会编译)。

我的问题是:有人捍卫这不是错误的立场吗?

4

3 回答 3

4

它为我编译。

唯一的结论是你已经导入了一个非Queuejava.util.Queue或导入了一个LinkedList非类java.util.LinkedList或两者兼而有之。

于 2012-12-08T23:35:48.460 回答
3

尝试明确地做:

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

请注意,使用它导入时package.*很容易被覆盖(如果您有一个与您显式导入或在工作包中同名的类):

文档

在包 p 的编译单元 c 中导入名为 n 的类型的单一类型导入声明 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>();
    }
}

您的类路径上是否有另一个类,例如java.util.Queue覆盖java.util.LinkedListJDK 的类?

于 2012-12-08T23:35:15.213 回答