我試圖定義一個包裝android.view.View
及其子類的類,並且包含一些渲染信息(人們可能將其稱爲View Model或PresentationModel)。Android編碼中的<T extends View>有沒有意義?
public class MyClass<T extends View>
{
private T view;
private Blah blah;
}
我的原始問題是,如果我應該使視圖變量的類型參數化或不。 Java的泛型實現似乎很簡單(例如,所有類型參數信息在編譯時都會被擦除),我可以在這裏找到兩個可能的優點。
1)向下看似冷卻器,即使我仍然需要在代碼中指定類型。
@SuppressWarnings("unchecked")
public final <U extends View> U getView()
{
return (U) view;
}
通過以上,
Button btn = (Button) obj.getView();
((LinearLayout) obj).addView(view);
變得
Button btn = obj.getView();
obj.<LinearLayout>addView(view);
2)I可能能夠寫一些多晶型碼;
@Override
public void bringToFront()
{
// stuff
}
如果一個方法被一些子類重新定義,
public final T getView()
{
return view;
}
以上,
obj.bringToFront();
強權的行爲不同,這取決於我們給類型參數。最大的問題是我不知道在Google的android框架中是否有任何實際的覆蓋情況。
目前,我會避免使用泛型,因爲顯然我不能使用HashMap
與泛型類。
Map<String, MyClass<View>> objs = new HashMap<String, MyClass<View>>();
MtClass<Button> obj = objs.get(key); // type mismatch
你總是可以使用'MyClass <?在您的最後一個示例中將視圖>'作爲您的值的類型 – fge
通常,在變量中使用變量在Java中被認爲是錯誤的代碼樣式,應該爲函數定義保留,請參閱Effective Java中的通配符一章。 –