我有一個超類(Android的碎片):是否有任何方法來檢查子類是否已通過泛型類型參數?
public abstract class BaseFragment<T> extends Fragment {
private T mListener;
public T getFragmentInteractionListener(){
return mListener;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
castFragmentInteractionListener();
}
void castFragmentInteractionListener(){
Type superClassType = this.getClass().getGenericSuperclass();
if (superClassType instanceof ParameterizedType) {
try {
// I want to know if there is any way to check if the type argument has
// been set? So I can avoid the exception.
Class<T> listenerClazz = (Class<T>) ((ParameterizedType) superClassType).getActualTypeArguments()[0];
mListener = FragmentUtils.castFragmentInteractionListener(context, this, listenerClazz);
} catch (Exception e) {
}
}
}
}
以及它的衍生一些子類。
public class FragmentDoesNotNeedListener extends BaseFragment {
}
public class FragmentHasListener extends BaseFragment<FragmentInteractionListener> {
interface FragmentInteractionListener {
void onClick();
void onExit();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getFragmentInteractionListener().onClick();
}
}
從本質上講,我希望每個片段從BaseFragment
派生,大多有可以從自己被稱爲偵聽器。我不想重複代碼來投射它,因此創建基本片段並使用泛型類型。但是,一些片段不需要使用偵聽器。但我不知道如何檢查參數類型是否給出。
在BaseFragment類中,方法castFragmentInteractionListener
將類轉換爲類字段,然後使用它將類轉換爲偵聽器。如果子類(FragmentDoesNotNeedListener
)沒有通過泛型類型參數,因爲異常將被捕獲,這是可以的。但是,我想知道是否有任何方法來檢查而不是捕獲異常?或者,也許這不是一個好的設計...
爲什麼你需要的?你不能在Child中使用模板模式嗎? – Blackbelt