首页 > 解决方案 > 返回 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
}

标签: javagenericsrefactoring

解决方案


您可以让方法将类返回为没有类型 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该类,并且您希望此方法具有类型限制的返回值。


推荐阅读