2014-05-15 14 views
1

這裏有幾個與使用Java中的泛型的類型不匹配有關的問題,但是我無法找到與我的案例相對應的任何東西。在Java中使用raw類型的mismtach類型

我不知道爲什麼這個錯誤發生在下面的代碼?

類型不匹配:不能從元件類型對象轉換爲字符串

在管線

爲(字符串元素:arg.someMethod())

但是,如果

SomeInterface arg 

改爲

SomeInterface<?> arg 

它的工作原理。爲什麼列表參數類型在未連接到接口類型參數時被刪除?

import java.util.List; 

public class TypeMismatchExample 
{ 
    interface SomeInterface<P extends Object> 
    { 
     P someParametrizedMethod(); 

     List<String> someMethod(); 
    } 

    void example(SomeInterface arg) 
    { 
     for (String element : arg.someMethod()) 
     { 
      // do something 
     } 
    } 
} 

回答

2

當你在你的代碼中的原始類型,在類的所有泛型類型信息丟失 - 因此,編譯器不知道someMethod返回String類型的List

的JLS的相關部分:Raw Types

的類型構造函數(§8.8),實例方法(8.4節,第9.4節),或者 非靜態字段(§8.3)的M個未從 它的超類或超接口繼承的原型C是對應 其類型的擦除在對應於 C.

所以一般聲明因爲你聲明的方法參數的原始類型s SomeInterface這是一種原始類型,即使其泛型類型參數與P不一樣,也不能使用泛型someMethod