我正在尝试创建一个接受泛型Class
的函数,有些函数使用Class
的函数,然后返回所述Class
的实例。
我收到编译错误:error: cannot select from a type variable - [ERROR] T.getManagers(), T.class);
。这是功能:
public static <T extends Bar> T getFoo(Class<T> fooClass , String person)
{
T foo = null;
try
{
Configuration config = Configuration.getConfiguration(person);
foo = (T) Bar.getInstance(config,T.getManagers(), T.class);
}
catch (Exception e)
{
logger.error("Error", e);
}
return foo;
}
编辑:我有办法调用Bar.getManagers()
吗?我正在尝试使用泛型,我说有5个类与Bar非常相似但不完全相同。他们都有getManagers()
。通过使用像T.getManagers()
这样的泛型,我试图绕过调用代码中的显式名称并使用通用名称代替。
答案 0 :(得分:1)
T.class
被禁止构建,因type erasure而无法使用它。请查看workaround
答案 1 :(得分:1)
您正在尝试使用Java中不允许的构造:
您不能使用T.getManagers()
,因为它是一个静态方法,并且类T
在运行时将不可用(类型擦除)。如果getManagers()
类存在于Bar
类中(并且它应该*),那么请改用Bar.getManagers()
。
出于同样的原因,您无法使用T.class
,而T
类在运行时将无法使用。请改用fooClass
。
您提供的代码应如下所示:
public static <T extends Bar> T getFoo(Class<T> fooClass , String person) {
T foo = null;
try {
Configuration config = Configuration.getConfiguration(person);
foo = (T) Bar.getInstance(config, Bar.getManagers(), fooClass);
} catch (Exception e) {
logger.error("Error", e);
}
return foo;
}
(*)此方法应位于Bar
中,因为它似乎是您在此处使用的常见行为,并且您似乎期望可以扩展T
的所有Bar
}。静态方法没有继承这样的东西。
答案 2 :(得分:0)
您可以在fooClass
对象上使用反射来获取并执行getManagers()
方法。如果类没有该方法,它将在运行时失败。
public static <T extends Bar> T getFoo(Class<T> fooClass , String person)
{
T foo = null;
try
{
Configuration config = Configuration.getConfiguration(person);
Method getManagers = fooClass.getDeclaredMethod("getManagers");
foo = (T) Bar.getInstance(config, getManagers.invoke(null), T.class);
}
catch (Exception e)
{
logger.error("Error", e);
}
return foo;
}
这不是一个很好的做法,但应该有用。