2012-01-15 158 views
44

爲了減少類的dependece通用類,我想送參數(使用泛型類)來擴展一些類並實現接口,例如擴展類並實現接口

public interface SomeInterface{ 
    public void someMethod(); 
} 

public class MyFragment extends Fragment implements SomeInterface{ 
    //implementation 
} 

//here is classs, that I need to create. T must extend Fragment and implements 
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a 
//dependence of SomeClass from MyFragment. 

public class SomeClass /*generic?*/ { 
    public SomeClass(T parent); 
} 

是否有可能構造?還有,使用我的T類,我想創建視圖,使用T.getActivity()作爲上下文。

+0

你能提供更多信息嗎?使用Java反射,您可以將'Class'對象傳遞給方法,並通過'getInterfaces()'檢查它的實現接口,並獲取/調用'Constructor'來創建一個新實例。但是您的具體用例還不清楚,因此很難弄清楚如何將這些項目組合在一起以解決您的特定問題。 – Devunwired 2012-01-15 16:41:29

+0

@Devunwired,更新了我的問題 – 2012-01-15 16:44:23

回答

106

T必須延長片段和實施SomeInterface

在這種情況下,你可以聲明SomeClass如下所示:

public class SomeClass<T extends Fragment & SomeInterface> 

這就需要T類型的對象既延長Fragment和實施SomeInterface

此外,使用我的T類,我想創建視圖,使用T.getActivity()作爲上下文。

我不熟悉與Android,但如果getActivity()Fragment聲明的公共實例方法,然後將完全可以調用它的T一個實例,因爲編譯器會知道所有T小號必須繼承方法。

+0

+1擊敗我。 – Devunwired 2012-01-15 17:01:58

+0

你會如何使用Mockito來創建一個類型爲T的模擬類? – 2017-08-14 15:01:18

+1

@bwicks好問題。我懷疑你的測試類可能需要聲明一個類似'抽象類TestFragment extends Fragment實現SomeInterface',然後用'TestFragment.class'來模擬該類型。 – 2017-08-15 15:53:34

6

你想做這樣的事嗎?

class SomeClass {} 

interface SomeInterface{ 
    public void someMethod(); 
} 

class AGenericClass<T> extends SomeClass implements SomeInterface { 
    public void someMethod() {} 
} 

這是允許的。

但是,您的問題的Android具體是什麼?我想我必須錯過一些東西,所以你能提供更多的細節?

更新下面

我還沒有完全確定你想要做什麼,我也不清楚,你需要擔心的依賴馬上,但這也是合法的,使用bounded type parameters

interface SomeInterface{ 
    public void someMethod(); 
} 

class Fragment { 
    public void aMethodInFragment() { } 
} 

public class SomeClass <T extends Fragment & SomeInterface> { 
    public SomeClass(T parent) { 
     parent.someMethod(); 
     parent.aMethodInFragment(); 
    } 
} 

類型參數<T extends Fragment & SomeInterface>指定T應的Fragment一個子類和實施SomeInterface

+0

更新了我的問題。 – 2012-01-15 16:43:37

4

這很容易,如果我明白你正確的你有一些類型T是擴展片段和實現一些接口。所以你必須寫這樣的東西。

abstract class TemplateFragment extends Fragment implements SomeInterface{} 

,然後在你的類

class SomeClass<T extends TemplateFragment> { 
... 
} 

它會做的伎倆。