2012-12-08 112 views
4

我的Java編譯器javac 1.6.0_37未能在編制以下的小程序:Java編譯器意外的 「不兼容的類型」 錯誤

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

你嘗試明確'的java .util.Queue q = new java.util.LinkedList ();'?也許你在目前的軟件包中有其他一些類'Queue '或什麼東西,它會攪亂一切? – amit

+1

您正在使用哪種類型的「隊列」對象?你有自己的'Queue'類嗎?從文檔看,沒有理由認爲這是行不通的。 – Makoto

+3

請注意,所需的類型是'Queue ',而不是'java.util.Queue '。刪除默認包中類路徑中的Queue類。永遠不要使用默認包。 –

回答

3

嘗試做明確:

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

注意與package.*導入時,很容易出現覆蓋(如果你有,你明確進口或在工作包中同名的類):

docs

在包 p的編譯單元C的單一型進口報關d用於導入一個典型值命名爲N個E陰影聲明:

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. 

你這裏是什麼類型的導入按需申報,這是由單一類型的進口報關陰影

+0

對,我已經想通了:在我的擴展目錄中,我找到了algs4.jar和stdlib.jar,這是Sedgewick算法課程的庫。我刪除了它們,現在一切正常。你用*導入的評論也解決了我以前的其他問題。謝謝阿米特。 – naitoon

+0

歡迎您@ user974955 – amit

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>(); 
    } 
} 

你對你的classpath如java.util.Queuejava.util.LinkedList這是壓倒一切的JDK彼此類?

4

它爲我編譯。

的唯一結論是,你已經導入之外的Queue類比java.util.Queue或進口LinkedList以外java.util.LinkedList或兩者兼而有之。