java - 返回 java.lang.Class以传递给泛型的 Java 方法
问题描述
我有这些代码行。
private void DoSomethingOnThePage(int pageNo){
List<T> result = null;
if(pageNo == 1)
result = Checker.Load(input, pageNo, CheckResultA.class);
else if(pageNo == 2)
result = Checker.Load(input, pageNo, CheckResultB.class);
else if(pageNo == 3)
result = Checker.Load(input, pageNo, CheckResultC.class);
else if(pageNo == 4)
result = Checker.Load(input, pageNo, CheckResultD.class);
// do something else with the result ....
}
我正在尝试为这些情况提取一种方法,使其成为这样。这样我就可以有一个更清晰的视图来查看我的代码中的工作流程。
private java.lang.Class<? extends T> GetClassTypeByPageNo(int pageNo){
if(pageNo == 1)
return CheckResultA.class;
else if(pageNo == 2)
return CheckResultB.class;
else if(pageNo == 3)
return CheckResultC.class
else if(pageNo == 4)
return CheckResultD.class
else
return CheckResultBase.class;
}
private void DoSomethingOnThePage(int pageNo){
result = Checker.Load(input, pageNo, GetClassTypeByPageNo(pageNo));
// do something else with the result ....
}
我尝试了很多方法,但未能找到正确的方法来编译。
Java可以做到这一点以及如何做到这一点?
还是有更好的方法来做到这一点?
谢谢你。
Checker.Load 的签名
private static <T extends CheckResultBase> List<T> Load(byte[] input, int pageNo, java.lang.Class<? extends T> type){
// load something in to the List
}
解决方案
您可以让方法将类返回为没有类型 T 的泛型,
private java.lang.Class<?> GetClassTypeByPageNo(int pageNo){
if(pageNo == 1)
return CheckResultA.class;
else if(pageNo == 2)
return CheckResultB.class;
else if(pageNo == 3)
return CheckResultC.class;
else if(pageNo == 4)
return CheckResultD.class;
else
return CheckResultBase.class;
}
或者可能是类似的东西,
private java.lang.Class<? extends CheckResultBase> GetClassTypeByPageNo(int pageNo){
假设您的所有CheckResultXXX
类都扩展了CheckResultBase
该类,并且您希望此方法具有类型限制的返回值。
推荐阅读
- python - 列表查找和替换
- angular - Angular 7,在重置表单后,表单始终有效,而它应该是无效的,因为它处于初始状态
- android - postDelayed 后视图不能为空
- vb.net - 下载器工作时显示“正在加载...”消息 (vb.net)
- css - 为什么图像不尊重绝对位置?
- jquery - Scotch Panels:使面板在“上方”打开,作为叠加层
- ascii - 如何使用脚本自动化来录制 asciinema 录音?
- php - display_errors 关闭时出现 php 错误
- go - 无法使用 Go 从 RabbitMQ 发送消息
- android - 错误:程序类型已经存在:org.intellij.lang.annotations.JdkConstants$PatternFlags 3