【问题标题】:Java method returning a java.lang.Class<? extends T> for passing into generics返回 java.lang.Class<? extends T> 用于传递到泛型
【发布时间】:2021-04-28 06:08:47
【问题描述】:

我有这几行代码。

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
}

【问题讨论】:

  • 看起来您可以只返回Class&lt;?&gt; 而不必担心T,因为无论如何您都没有限制它。 Checker.load的签名是什么,result的类型是什么?
  • T 来自哪里?是否在 class YourClass&lt;T&gt; 之类的类上声明,如果没有,则必须在方法上声明:private &lt;T&gt; Class&lt;? extends T&gt; GetClassTypeByPageNo(int pageNo)

标签: java generics refactoring


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 2013-08-13
    • 2015-06-14
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多