Java编译器意外“不兼容的类型”错误

时间:2012-12-08 23:29:15

标签: java javac

我的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编译此代码。此外,你可以从图片中取出泛型,问题仍然是相同的(即使没有泛型也不会编译)。

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

3 个答案:

答案 0 :(得分:4)

它为我编译。

唯一的结论是,您已导入Queue以外的java.util.Queue类,或导入LinkedList以外的java.util.LinkedList或两者。

答案 1 :(得分:3)

尝试明确地做:

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

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

来自docs

  

包的编译单元c中的单一类型导入声明d   导入名为n的类型的p隐藏声明:

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.

这里有一个按需输入类型的声明,它被一个类型的导入声明所遮蔽

答案 2 :(得分:2)

必须有一些其他错误,因为compiles fine with ideone使用Java 1.6.0.31:

import java.util.*;

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

您的类路径上是否有另一个类,如java.util.Queuejava.util.LinkedList,它覆盖了JDK?