2013-06-24 27 views
4

爲什麼編譯?爲什麼在Java中編譯?

B在沒有任何通用參數的情況下使用,並且這在Java中編譯。這裏發生了什麼?

interface B<T> 
{ 
    public T Foo(T value); 
} 

public class A 
{ 
    public B What() 
    { 
     return null; 
    } 

    public void Foo() 
    { 
     B x = What(); 
     x.Foo(123); 
    } 
} 

回答

7

您只是在這裏使用raw類型B。就像

List list = new ArrayList(); // defined as: public interface List<E> 

完美,有效;不推薦。

+0

什麼類型的對象可以添加到列表中?一切都被視爲「對象」嗎? – cgTag

+0

是的,使用原始類型意味着可以添加任何對象。所以,如果你有一個'String'的列表(沒有泛型),如果你稍後嘗試向它添加一個Integer,編譯器就不會抱怨。 –

+2

@nachokk它不一樣,編譯器用原始類型處理表達式有點不同。 (雖然它可能夠接近。) – millimoose

8

這是爲了與J2SE 5.0之前的Java兼容。你應該得到一個rawtypes警告(注意編譯器警告)。

+0

這是因爲類型擦除工作嗎? –

+2

它的工作原理是因爲泛型是編譯器小說。 –

+1

@HotLicks如果你編譯爲本地代碼,一切都是編譯器小說。 –