2014-10-04 56 views
0

我试图创建一个通用基础类,但得到从类型参数

这里的“不能从它的类型参数错误伸出”扩展为我的课:

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或其他扩展活动的其他类。

我该如何实现我的目标?

编辑:

我要像

public class TestActivity<FragmentActivity> extends BaseActivity

​​

用法通过这样做,我将能够使用ListActivity或FragmentActivity`s比如getListView()或getSupportedFragmen tManager()

+0

看起来你想扩展'Activity'而不是'E'。泛型用于允许您的类定义泛型类型的值,这似乎不是您想要在代码中执行的操作。 – 2014-10-04 12:31:50

+0

你试图达到的目标并不完全清楚。你能编辑你的问题来提供你想要用代码表示什么结构的概述吗? – Bobulous 2014-10-04 12:38:18

回答

1

我不认为你可以实现你想要的使用子类型。首先,Java从一开始就不支持泛型。为了保持向后兼容,通用类型在运行时得到,因此在您的情况下,动态地,每个E实例都被替换为Activity,即使您实例化了BaseActivity<ListActivity>

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

abstract class BaseActivity<E extends Activity> { 
    public E activity; 
    public BaseActivity(E activity){ 
    this.activity = activity; 
    } 
// ... 
} 

它将为您提供一个间接访问传递给它的一般活动的方法。然而,这意味着你不能多形地把BaseActivity放在需要泛型类型的地方,因为它不能继承它。

不过,你现在可以做的是(假设BaseActivityImplBaseActivity非抽象变体):

(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不是覆盖eat,因为签名不匹配。

Edit2另外,如果泛型超类没有提供默认的构造函数,就没有办法实例化它。

+0

感谢您的建议。这对我来说很清楚。我想我要去肮脏的方式,并复制我的BaseActivity类,如BaseFragmentActivity和BaseListActivity。 – 2014-10-04 13:13:55