【问题标题】:How to set a class Name as a method's parameter?如何将类名设置为方法的参数?
【发布时间】:2020-02-17 08:23:12
【问题描述】:

我想发送一个类名作为方法的参数。我想这样使用(执行)它。

orderDao.getTheMostFrequentType(EmployeeOrder.class);

我有这个代码

@Override
public String getTheMostFrequentType(Class<T> orderClass){
    String tableName = orderClass.getAnnotation(Table.class).name();
    String sqlQuery = "SELECT STATS_MODE(signed_by_id) FROM " + tableName;
    String result = (String)getSessionFactory().getCurrentSession().createSQLQuery(sqlQuery).uniqueResult();
    return result;
}

但它执行尝试给了我:

getTheMostFrequentType("org.apache.poi.ss.formula.functions.T") method cannot be applied in "java.lang.entities.EmployeeOrder"

我应该导入其他类而不是 apache.poi。但是哪一个?我做错了什么?

【问题讨论】:

  • 这是什么T?为什么它来自apache.poi?
  • 什么是orderClass
  • 表示泛型。
  • 检查您的导入语句。
  • 您的Class&lt;T&gt; 在这里并不意味着通用,因为您似乎已经从 Apache 库中导入了一个名为 T 的类 --> org.apache.poi.ss.formula.functions.T。我认为它的发生是因为你的类没有定义T(我们可以看到你的方法也没有)。为了解决这个问题,您按照 IDE 的建议执行了操作,导入了一个已知的 T 类。

标签: java class generics reflection annotations


【解决方案1】:

如果你在类级别的方法中使用T,你必须首先在类/方法定义中定义它,除非“T”是未知的。

public class MainClass<T> extends Parent
{...}

或

public <T> String getTheMostFrequentType(Class<T> orderClass)
{...}

另一个选项是不使用标记“?”定义特定类型的 T 在你的情况下,我认为这是更好的解决方案

提示:如果不是真的,最好不要用泛型使代码变得复杂 需要。

这样:

public String getTheMostFrequentType(Class<?> orderClass)
{...}

【讨论】:

  • 为什么是you MUST define it first in class definition? Java 中允许使用非静态泛型方法
  • @Holger - 这只是一个例子,我同意在这种情况下并不需要通用,他可以使用“?”
【解决方案2】:

正如 cmets 中所建议的,问题是由未声明类型参数 T 而是导入实际类型 T 引起的。

问题已通过将Class&lt;T&gt; 替换为Class&lt;?&gt; 解决。

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 2012-10-15
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多