2016-12-05 38 views
1

誰能請解釋一下我下面的代碼Java泛型方法在水平

public <T extends Emp> void foo(ArrayList<T> list) { 
    list.add(list.remove(0)); // (cycle front element to the back) 
} 

我想了解泛型將如何適用於返回類型爲void。 注意:我已經改變了代碼,現在它沒有給出任何錯誤。

+1

它並不適用於無效。它用於ArrayList。 –

+2

這段代碼不會編譯。你正在嘗試向'ArrayList '添加一個'String',其中'T'絕對不是一個字符串。 – yole

+0

他們不適用於無效。 – GurV

回答

3

我想了解泛型將如何應用於void返回類型。

這只是一種語法。泛型不適用於void返回類型,它們適用於整個方法。

泛型參數的名稱和限制需要放在程序文本的某處。在類聲明中,它們在尖括號中跟隨類名。在通用方法聲明中,它們遵循可訪問性指示符public,並且在返回類型void之前。

人們可以很容易想象泛型類型的替代位置,如

public void foo<T extends Emp>(ArrayList<T> list) // Imaginary syntax 

甚至

public void foo(ArrayList<T> list) <T extends Emp> // Imaginary syntax 

但Java的設計者決定返回類型代號前的位置。

2

泛型不適用於void

如果您認爲類型爲<T extends Emp>,您的意思是說,可以應用Emp的任何子類型來代替T

在你的代碼,你可以使用<T>代替<T extends Emp>因爲你不與Emp

public <T> void foo(ArrayList<T> list) { 
    list.add(list.remove(0)); // (cycle front element to the back) 
} 

關於如何它會工作,該類型將由您在使用此方法來提供做任何事情並且在編譯時,java會自動放置所需的強制轉換。所以,如果你使用的是這樣的:

ArrayList<String> list = new ArrayList<>(); 
// Add some items into list 
foo(list); 
在這種情況下

,你foo()方法找出型<T>String等,將表現是這樣的:

public void foo(ArrayList<String> list) { 
    list.add((String)(list.remove(0))); 
}