我有以下方法:
public Push getPush() {
Push plugin;
String pluginName = PGPluginNames.PUSH;
if (!isPluginInitialized(pluginName)) {
plugin = (Push) GWT.create(Push.class);
plugin.initialize();
phoneGap.loadPlugin(pluginName, plugin);
initializedPlugins.add(pluginName);
}
else {
plugin = (Push) phoneGap.getPluginById(pluginName);
}
return plugin;
}
我想将此方法转换为通用方法。我尝试了以下方法:
public <T extends PhoneGapPlugin> T getType(T t, String pluginName) {
T plugin = null;
if (!isPluginInitialized(pluginName)) {
plugin = (T) GWT.create(t.getClass());
plugin.initialize();
phoneGap.loadPlugin(pluginName, plugin);
initializedPlugins.add(pluginName);
}
else {
plugin = (T) phoneGap.getPluginById(pluginName);
}
return plugin;
}
这会产生编译错误。
Only class literals may be used as arguments to GWT.create()
我不知道如何得到T的类文字因为我不能做T.class GWT.create()
会抛出错误。
有没有办法解决这个问题?
编辑:
我也尝试了以下代码:
public <T extends PhoneGapPlugin> T getType(Class<T> classLiteral, String pluginName) {
T plugin = null;
if (!isPluginInitialized(pluginName)) {
plugin = (T) GWT.create(classLiteral);
plugin.initialize();
phoneGap.loadPlugin(pluginName, plugin);
initializedPlugins.add(pluginName);
}
else {
plugin = (T) phoneGap.getPluginById(pluginName);
}
return plugin;
}
它给出错误:
Only class literals may be used as arguments to GWT.create()
还有对演员的警告:
Type safety: Unchecked cast from Object.
有没有办法阻止这种情况?
答案 0 :(得分:4)
您无法获得T
的班级文字。您需要将Class<T>
作为参数传递给您的方法。
例如,您可以将它与EnumMap
构造函数进行比较,它需要类文字,并且因为它无法从类型参数推导出它,所以构造函数看起来像下面这样:
public EnumMap(Class<K> keyType)
这个方法很特殊,因为编译器必须能够在编译时确定所请求的类型 。如果它是方法的参数,编译器就无法告诉在运行时将该参数传递给泛型方法的内容。该方法的Javadoc明确说明了这一点:
create(Class)
的参数必须是一个类文字,因为生产模式编译器必须能够在编译时静态地确定所请求的类型。这可能很棘手,因为使用Class变量可能似乎在开发模式下正常工作。
换句话说,你运气不好。除了类文字之外,你不能放任何东西,即Push.class
作为GWT.create的参数。