2014-10-04 54 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