扩展类并实现接口的泛型类

时间:2012-01-15 16:29:08

标签: java android generics

为了减少类的依赖,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如

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()作为Context。

4 个答案:

答案 0 :(得分:118)

  

T必须扩展Fragment并实现SomeInterface

在这种情况下,您可以将SomeClass声明为以下内容:

public class SomeClass<T extends Fragment & SomeInterface>

这需要T类型的对象扩展Fragment并实施SomeInterface

  

此外,使用我的T类,我想创建视图,使用T.getActivity()作为Context。

我不熟悉Android,但如果getActivity()Fragment中声明的公共实例方法,则完全有可能在T的实例上调用它,因为编译器会知道所有T必须继承该方法。

答案 1 :(得分: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

答案 2 :(得分:4)

如果我理解你纠正你有一些类型T正在扩展Fragment并实现一些接口,这很容易。所以你必须写那样的东西。

abstract class TemplateFragment extends Fragment implements SomeInterface{}

然后在你的课程中

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

它会起作用。

答案 3 :(得分:0)

对于Kotlin,您可以使用以下语法:

class MyClass<T> where T: AnotherClass, T: SomeInterface