我试图定义一个包装类 android.view.View
及其子类,并包含一些有关渲染的信息(人们可能将其称为 View Model 或 PresentationModel)。
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)我也许可以写一些多态代码;
@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