为了减少类的依赖,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如
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。
答案 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