有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:泛型类型转换,如何修复此问题,从而不抑制未检查的警告

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);

共 (1) 个答案

  1. # 1 楼答案

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

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

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

    我刚刚告诉你你做错了什么。您必须处理适当的异常,还必须检查所传递的类是否具有0-arg构造函数,否则它将无法工作