2016-08-14 68 views
-1

考慮到我有以下接口:Java泛型 - 有什麼區別?

public interface MyInterface<T extends Number> 

在另一類我要聲明這樣一個方法:

public <T extends MyInterface<?>> void abc(T a); 

這是一個正確的方法是什麼?或者,也許我應該寫:

public <T extends MyInterface<T>> void abc(T a); 

這兩個聲明有什麼區別?

+3

請告訴我們你想達到的目標,你的用例以及你想要的繼承模型,然後我們將能夠提供幫助。 – faizan

+2

另外我不認爲第二個聲明是你想要的。如果T = MyClass,那麼聲明就變成了public >,這就是你的用例需要的嗎? – faizan

+0

我是第一次宣佈實現自己的目標,但我看到了第二個地方,我只是想知道他們之間的差異。感謝您的回覆 –

回答

1

一些接口旨在將實現類作爲泛型類型。

例如,Comparable接口通常被實現爲:

class MyClass implements Comparable<MyClass> 

因爲然後在Comparable聲明的方法

int compareTo(T o); 

可用於的MyClass實例比較的另一個實例同班。

其他接口具有不同類型的泛型參數。例如,List<T>,其中T指示列表中包含的對象的類型。

如果你聲明的方法與:

public <T extends MyInterface<T>> void abc(T a); 

那麼你說,類T實現在類實現Comparable接口方式的接口MyInterface - 以自己爲泛型類型。根據MyInterface的實際情況,這可能也可能不合適。

如果你聲明的方法與:

public <T extends MyInterface<?>> void abc(T a): 

,那麼你不放置任何約束在T的實施MyInterface泛型類型。

另一種選擇是

public void abc(MyInterface<?> a); 

這是編寫將接受MyInterface任何實現的方法,最簡單的方法。

+0

感謝您的解釋。現在我明白了不同之處 –