2013-06-19 33 views
1
通用接口

任何人都可以解釋我爲什麼在下面的代碼創建只有B時,得到一個錯誤:java中收集

public class factory { 

    public <T> void createA(List<I<T>> c) { 
     A a = new A(c);//warning here 
    } 

    public <T> void createB(List<I<T>> c) { 
     B b = new B(c);//error here: The constructor B(List<I<T>>) is undefined 
    } 
} 

interface I<T> { 
} 


class B implements I<Integer> { 

    public B(List<I<?>> c) { 
    } 
} 

class A<T> implements I<T> { 

    public A(List<I<?>> c) { 
    } 
} 

B級是通用的,A是沒有,但我不知道爲什麼它的事項在這種情況下。

+1

我希望你已經導入了'List'。如果不是,我認爲這是錯誤。 –

+0

你得到了什麼錯誤信息? – 2013-06-19 14:19:26

+0

我忽略了導入語句,這裏沒有問題。我得到:「構造函數B(列表>)是未定義的」 「,因爲我在評論中寫道。 –

回答

6
public B(List<I<?>> c) { 
} 

?unknown type。這不是任何其他類型的通配符。編譯器道出了實情,沒有構造函數的類型List<I<T>>T不是?

它並不真正的另一種方法工作了。您只需通過「未經檢查的轉換」警告來交換編譯錯誤。由於類A是parametized,你必須調用它像:

public <T> void createA(List<I<T>> c) { 
    A<T> a = new A<T>(c); 
} 

,瞧,問好了同樣的錯誤。

+0

但是,爲什麼這個工作?只需將它添加到類B:'static class B implements I {'Constructor仍然是一樣的,但沒有更多的編譯器錯誤。 – darijan

+0

那麼爲什麼要爲A級工作呢? –

+0

現在您會收到「未經檢查的轉化」警告。是的,它編譯。但是如果你想避免未經檢查的轉換,它仍然是不可能的。 –

1

A是一個通用類,這意味着當您單獨使用A時,它是一種原始類型。在使用原始類型時,關閉其所有方法和構造函數的泛型。因此,例如,以下將編譯:

A a = new A(new ArrayList<String>()); 

B不是一個通用類,所以使用B本身不是一個原始類型,並不會關閉仿製藥。