【问题标题】:Generic class that extends class and implements interface扩展类并实现接口的通用类
【发布时间】:2012-01-15 16:29:07
【问题描述】:

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

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() 作为上下文。

【问题讨论】:

  • 您能提供更多信息吗?使用 Java 反射,您可以将 Class 对象传递给方法,并通过 getInterfaces() 检查其实现的接口,以及获取/调用 Constructor 以创建新实例。但是您的具体用例尚不清楚,因此很难弄清楚如何将这些项目组合在一起以解决您的特定问题。
  • @Devunwired,更新了我的问题

标签: java android generics


【解决方案1】:

T 必须扩展 Fragment 并实现 SomeInterface

在这种情况下,您可以将SomeClass 声明如下:

public class SomeClass<T extends Fragment & SomeInterface>

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

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

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

【讨论】:

  • 如何使用 Mockito 创建一个 T 类型的模拟类?
  • @bwicks 好问题。我怀疑您的测试类可能需要声明像 abstract class TestFragment extends Fragment implements SomeInterface 这样的类型,然后使用 TestFragment.class 模拟该类型。
  • 这太不直观了,谢谢。 ^^'
【解决方案2】:

你想做这样的事情吗?

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();
    }
}

类型参数&lt;T extends Fragment &amp; SomeInterface&gt;指定T应该是Fragment的子类并实现SomeInterface

【讨论】:

    【解决方案3】:

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

    abstract class TemplateFragment extends Fragment implements SomeInterface{}
    

    然后在你的课堂上

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

    它会成功的。

    【讨论】:

    • 它可以工作,但如果您的子类需要为示例实现不同类型的“片段”,而不是片段,我们想在这里使用视图。所以子类可能是 CustomView extends LinearLayout implements SomeInterface 由于 LinearLayout 是 View 使用 BaseClass 时条件仍然成立
    【解决方案4】:

    对于 Kotlin,您可以使用这样的语法:

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

    【讨论】:

      【解决方案5】:

      Kotlin 等价物是:

      class SomeClass<T>() where T: Fragment, T: SomeInterface
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 2013-09-25
        相关资源
        最近更新 更多