2012-01-15 118 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> { 
... 
} 

它会做的伎俩。