我正在尝试创建一个通用基类,但是“无法从其类型参数错误扩展”
这是我的班级:
package com.akturk.bella.activity;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.FragmentActivity;
abstract class BaseActivity<E extends Activity> extends E {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentView());
}
@Override
public void onContentChanged() {
super.onContentChanged();
ButterKnife.inject(this);
}
protected abstract
@LayoutRes
int getContentView();
}
我想要做的是传递一个类参数,从另一个类扩展基类,如FragmentActivity或ListActivity或其他扩展Activity的东西。
我如何实现目标?
编辑:
我想要像
这样的用法 public class TestActivity<FragmentActivity> extends BaseActivity
或
public class TestActivity<ListActivity> extends BaseActivity
通过这样做,我可以使用ListActivity或FragmentActivity的特定方法,如getListView()或getSupportedFragmentManager()
答案 0 :(得分:1)
我认为您无法使用子类型来实现您想要的效果。首先,Java从一开始就不支持泛型。为了保持向后兼容,泛型类型在运行时被擦除,因此在您的情况下,动态地,E
的每个实例都被Activity
替换,即使您实例化{{1 }}。
但是,您可以尝试使用合成来实现类似的功能。
BaseActivity<ListActivity>
它为您提供了对您传递的通用活动的方法的间接访问权限。但是,这意味着您不能将abstract class BaseActivity<E extends Activity> {
public E activity;
public BaseActivity(E activity){
this.activity = activity;
}
// ...
}
多态地放在需要其泛型类型的位置,因为它不会将其子类化。
但是,你现在可以做的是(假设BaseActivity
是BaseActivityImpl
的非抽象变体):
BaseActivity
编辑:实际上,如果你想要实现的目标能够真正发挥作用,那么还有一个更基本的问题:
(new BaseActivityImpl<ListActivity>(theListActivityInstance)).activity.getListView()
如果您拨打class Cat<A> extends A {
String eat(){ return "Cat is eating"; }
}
class Dog {
void eat(){ System.out.println("Dog is eating"); }
}
会怎么样? (new Cat<Dog>()).eat();
并未覆盖Cat
,因为签名不匹配。
Edit2 :另外,如果通用超类不提供默认构造函数,则无法实例化它。