2016-07-05 236 views
0

我在寫一個方法,要求它的某個參數從特定類(MyClass)下降並實現一個接口(MyInterface)。指定方法參數必須從一個類繼承並實現接口

這樣做的一種粗暴的方式將

public void doStuff(MyClass arg0) { 
    if (!(arg0 instanceof MyInterface)) 
     throw new IllegalArgumentException("arg0 must implement MyInterface"); 
    // do whatever we need to do 
} 

注意MyClass沒有實現MyInterface,都是我進口,因爲它們的類。

是否有更好的方法來做到這一點,最好是在構建時已經標記錯誤的方法?

+1

'public void doStuff(MyInterface someclass)'?那麼只需讓MyClass實現MyInterface? –

+0

@blahfunk這兩個類只是進口,所以這不是一個選項。我澄清了這個問題。 – user149408

回答

5

你可以做到這一點與下面的泛型方法:

public <T extends MyClass & MyInterface> void doStuff(T arg) { ... } 

假設下面的類(和接口)

class MyClass {} 
interface MyInterface {} 

class A extends MyClass {} 
class B implements MyInterface {} 
class C extends MyClass implements MyInterface {} 

以下兩個語句是非法的(編譯錯誤)

doStuff(new A()); 
doStuff(new B()); 

而下面的語句將編譯

doStuff(new C()); 

有關somehwat奇怪類型變量聲明的更多信息,請參閱JLS §4.4 (Type Variables)

+0

根據代碼結構的不同,你可能只能執行'void doStuff(C arg)' – 4castle

+1

呃......如果其他類也擴展了那個類並實現了這個接口,它將不起作用。 – Seelenvirtuose

+0

那麼,你可以讓這些其他類'擴展C',但這可能是不可能的OP,因此爲什麼它「取決於代碼結構」 – 4castle

相關問題