1
private static transient JavaPlugin myPlugin = null;

public SomeClass(JavaPlugin plugin) {
    if (myPlugin == null) myPlugin = plugin;
}

public <T> T getPlugin(Class<? extends JavaPlugin> plugin) {
    return (T)myPlugin; // return casted version of "myPlugin" form above
}

在下面的行中调用它就可以了,并且尝试使用不扩展 JavaPlugin 的类将引发编译时错误。但是我怎样才能做到以上功能不需要@SuppressWarnings("unchecked")

MyPlugin nc = this.getPlugin(my.main.package.MyPlugin.class);
4

1 回答 1

6

您知道您实际上是Class从您的方法返回一个实例,并将其存储在 type 的引用中MyPlugin?因此,您实际上是在将Class<MyPlugin>实例分配给MyPlugin. 那是行不通的。

要解决此问题,您必须使用Class#newInstance()方法返回您正在传递的该类的实例。并使参数类型Class<T>

public <T extends MyPlugin> T getPlugin(Class<T> plugin) {
    return plugin.newInstance();
}

好吧,我刚刚让你知道你做错了什么。您必须处理适当的异常,并检查您传递的类是否具有 0-arg 构造函数,否则它将不起作用。

于 2014-01-10T10:02:07.983 回答