2012-05-01 34 views
3

隨着通用的方法,它可以擴展多個類型的參數,如:列表與延伸不止一種類型的

<T extends MyClass & MyInterface> void foo(T bar) 

是否有指定與延伸超過一個參數列表的方式類型?

List<MyClass & MyInterface> myList; 

不工作...

這將允許:

class A extends MyClass implements MyInterface{} 

class B extends MyClass implements MyInterface{} 

myList.add(new A()); 
myList.add(new B()); 

MyClass c = myList.get(index); 
MyInterface i = myList.get(index); 

foo(myList.get(index)); 
+0

你期望什麼語義?派生的MyClass或MyInterface,派生的MyClass和MyInterface,其他 –

+0

所有條目都應擴展( - >和) – Puce

回答

3

答案沒有。

根據您的語義期望你會找到一個解決方法FOO

<T extends MyClass> void foo(T bar) { 
    if (bar instanceof MyInterface) return; 
    } 

也許最好的方法是創建一個類型既提供類型

一個可能的解決方法。 的缺點是,所有有趣的類需要從該類

abstract class MyClassInterface extends MyClass implements MyInterface {} 

List<MyClassInterface> myList; 


<T extends MyClassInterface> void foo(T bar) 

簡易方法只是提供這兩種方法會造成歧義得來,所以它不是一個可能的(即「AND」,對於「異或」它將是有效的)

<T extends MyClass> void foo(T bar) 

<T extends MyInterface> void foo(T bar) 
+0

我擔心這將是答案,只是想確認。鑑於已經實施的方法,是否有他們不允許的原因? – Puce

+0

注意: void foo(T吧) == void foo(SomeClass bar) – Puce

+0

我認爲這是可以做到的,但很難表達一種特殊的語法,太少的情況下,它將是有用的 –

3

這是絕對不可能的,除非類型在同一類型層次屬於(在這種情況下,你將指定T extends TopMostBase)。

如果有可能,這將從根本上打破仿製藥的整個觀念(你可以和指定List<?> myList和處理它,就好像沒有仿製藥可言,手工做的所有的類型檢查。)

+1

'這實質上會打破泛型的整個想法'請你詳細說明一下這個聲明吧?根據我的理解,OP希望他的泛型類型'T' *擴展*'MyClass',並且*實現*'MyInterface'。爲什麼會打破泛型的想法? :\ – amit

+0

@amit:gee,我不明白,基於提供的語法。從'List '我推斷他想存儲'MyClass'或'MyInterface'的實例。似乎合乎邏輯? –

+0

在問題中查看我更新的示例。如上所述,我期待「和」行爲不是「或」。 – Puce