从类型参数扩展

时间:2014-10-04 11:47:43

标签: java android inheritance extends

我正在尝试创建一个通用基类,但是“无法从其类型参数错误扩展”

这是我的班级:

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

1 个答案:

答案 0 :(得分:1)

我认为您无法使用子类型来实现您想要的效果。首先,Java从一开始就不支持泛型。为了保持向后兼容,泛型类型在运行时被擦除,因此在您的情况下,动态地,E的每个实例都被Activity替换,即使您实例化{{1 }}。

但是,您可以尝试使用合成来实现类似的功能。

BaseActivity<ListActivity>

它为您提供了对您传递的通用活动的方法的间接访问权限。但是,这意味着您不能将abstract class BaseActivity<E extends Activity> { public E activity; public BaseActivity(E activity){ this.activity = activity; } // ... } 多态地放在需要其泛型类型的位置,因为它不会将其子类化。

但是,你现在可以做的是(假设BaseActivityBaseActivityImpl的非抽象变体):

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 :另外,如果通用超类不提供默认构造函数,则无法实例化它。