通用BaseFragment验证实现的接口回调

我有这样的BaseFragment:通用BaseFragment验证实现的接口回调

public abstract class BaseFragment<C> extends Fragment { 

protected C callback;

@Override

@SuppressWarnings({"unchecked"})

public void onAttach(final Context context) {

super.onAttach(context);

try {

this.callback = (C) getActivity();

} catch (final ClassCastException e) {

throw new ClassCastException(context.toString() + " must implement " + this.callback.getClass().getSimpleName());

}

}

}

我有一个执行片段:

public class MainFragment<C extends MainFragment.Callback> extends BaseFragment<C> { 

public static MainFragment newInstance() {

MainFragment<Callback> fragment = new MainFragment<>();

return fragment;

}

public interface Callback {

void doSomething();

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_main, container, false);

return view;

}

}

我创建一个静态的newInstance方法的片段。 当我在onAttach中放置断点时,它永远不会失败,我的活动甚至没有实现回调。

我做错了什么?

回答:

这就是Type Erasure

的问题是什么意思?泛型类仅在编译时存在。在运行时,你可以考虑泛型类的每个实例,就好像它是一个Object类的实例。

你在运行时类将是这样的:

protected Object callback; 

@Override

@SuppressWarnings({"unchecked"})

public void onAttach(final Context context) {

super.onAttach(context);

try {

this.callback = (Object) getActivity();

} catch (final ClassCastException e) {

throw new ClassCastException(context.toString() + " must implement " + this.callback.getClass().getSimpleName());

}

}

所以你没有得到任何的异常,因为getActivity()返回一个活动是一个Object实例

以上是 通用BaseFragment验证实现的接口回调 的全部内容, 来源链接: utcz.com/qa/265666.html

回到顶部