Java:通用类型转换,我该如何解决这个问题,所以我不会抑制未经检查的警告

Bri*_*ham 1 java generics extends casting unchecked-cast

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
}
Run Code Online (Sandbox Code Playgroud)

在下面的行中调用它可以正常工作,并且尝试使用不扩展JavaPlugin的类将引发编译时错误.但是我怎样才能使上述功能无需工作呢@SuppressWarnings("unchecked")

MyPlugin nc = this.getPlugin(my.main.package.MyPlugin.class);
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 6

您是否知道您实际上是Class从方法返回一个实例,并将其存储在类型的引用中MyPlugin?所以,你实际上是在分配Class<MyPlugin>实例MyPlugin.那是行不通的.

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

public <T extends MyPlugin> T getPlugin(Class<T> plugin) {
    return plugin.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

好吧,我刚刚给你一个关于你做错了什么的想法.您必须处理适当的异常,并检查您传递的类是否具有0-arg构造函数,否则它将不起作用.