如何将方法转换为通用方法?

时间:2014-11-25 15:17:44

标签: java generics gwt

我有以下方法:

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.

有没有办法阻止这种情况?

1 个答案:

答案 0 :(得分:4)

Java语言的约束

您无法获得T的班级文字。您需要将Class<T>作为参数传递给您的方法。

例如,您可以将它与EnumMap构造函数进行比较,它需要类文字,并且因为它无法从类型参数推导出它,所以构造函数看起来像下面这样:

public EnumMap(Class<K> keyType)

GWT的约束和创建方法

这个方法很特殊,因为编译器必须能够在编译时确定所请求的类型 。如果它是方法的参数,编译器就无法告诉在运行时将该参数传递给泛型方法的内容。该方法的Javadoc明确说明了这一点:

  

create(Class) 的参数必须是一个类文字,因为生产模式编译器必须能够在编译时静态地确定所请求的类型。这可能很棘手,因为使用Class变量可能似乎在开发模式下正常工作。

换句话说,你运气不好。除了类文字之外,你不能放任何东西,即Push.class作为GWT.create的参数。