2012-08-10 67 views
4

這個C#聲明在Java中等價於什麼?什麼是C#通用約束的Java等價物「T,K:其中T:它<K>」?

public class AsyncThreadPool<T, K> where T : IAsyncThread<K> { 

IAsyncThread是一個接口

public interface IAsyncThread<T> 
{ 
    T GetAsyncUsedObject(); 
    void StartAsyncRequest();  
} 

我曾嘗試:

public class AsyncThreadPool<T extends IAsyncThread<K>, K > 

但是是不正確的,爲T實現IAsyncThread<K>不擴展它。

而且我需要在這個類中使用T.StartAsyncRequest()或類似

在C#中,它是:在Java中

T asyncThread = default(T); 
asyncThread.StartAsyncRequest() 
+0

'T asyncThread = default(T);':這行會給你一些麻煩。由於Java通過擦除實現泛型,因此它不知道'T'在運行時的類型。 – StriplingWarrior 2012-08-10 15:07:13

+0

如果你真的需要創建一個'T'的實例,你必須以某種方式傳遞'Class '的參數來創建這個新對象。 – atamanroman 2012-08-10 15:10:33

+2

當在泛型中使用'extends'時,如果T'擴展'或'實現'後面的類/接口並不重要。關鍵字仍然是「擴展」。 – 2012-08-10 15:11:08

回答

5

您的<T extends IAsyncThread<K>>是正確的。儘管類本身實現了,而不是擴展,但泛型定義的術語得到了擴展。如果你想要的話,你可以使用<T extends Object & IAsyncThread<K>><T extends Object, IAsyncThread<K>>,但不需要。

要創建類型T的成員,您真正擁有的唯一東西就是使用工廠對象。

public class AsyncThreadPool<T extends IAsyncThread<K>, K> { 
    private final AsyncThreadFactory<T> factory; 
    public ASyncThreadPool(AsyncThreadFactory<T> factory) { 
     this.factory = factory; 
    } 
    public void foo() { 
     T t = factory.createDefault(); 
     t.startAsyncRequest(); 
    } 
} 
+0

太好了,謝謝你的回答! – Alex 2012-08-10 16:35:27

10

通用的限制只能有兩種選擇,extendssuper,並且在沒有任何區別這種情況在擴展和實施之間。您的方法聲明代碼應該按原樣工作。

對於實例化,您將不得不使用T的類來創建它。因爲不能直接使用T.class,所以如果需要創建模式的可重用性,您可以創建一個工廠,例如corsiKa建議的,或者您可以將Class<T>傳遞給您的類的構造函數並保留該實例。

public class AsyncThreadPool<T extends IAsyncThread<K>, K>{ 
    private final Class<T> clazz; 
    public AsyncThreadPool(Class<T> clazz){ 
     this.clazz = clazz; 
    }  
    public void Start() throws InstantiationException, IllegalAccessException{   
     T instance = clazz.newInstance(); 
     instance.StartAsyncRequest(); 
    } 
} 

這也可能是需要注意的是,在C#中,使用default(T)一類或接口會產生一個空引用等你原來的例子是不正確。

+0

@corsiKa編輯。 – 2012-08-10 15:19:45

+0

@corsiKa哎呀,誤解了原來的問題,對不起。 :| – 2012-08-10 15:48:29

+0

@corsiKa編輯,謝謝。 – 2012-08-10 16:18:56

2

你的代碼應該是罰款:

public class AsyncThreadPool<T extends IAsyncThread<K>, K > 

有了泛型,extends可能意味着延長或實施。

相關問題