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

标签 java generics casting extends 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
}

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

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

最佳答案

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

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

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

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

关于Java:通用类型转换,我该如何解决这个问题,这样我就不会抑制未经检查的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041148/

相关文章:

java - 将 Eclipse 项目连接到新的 GitHub 存储库

java - 没有发现行异常

java - 如何在java中将调用方法作为后台进程

c# - 在 WPF 中将 TabItem 转换为 UserControl

c# - 向上转型泛型

java - 从 JAXB 转换 null java.lang.Integer 产生 0,而不是 null

java - Android - 如何更大地显示我的启动屏幕图形?

java - 为什么我的迭代器 foreach 循环永远不会进入/执行?

Java 从泛型 Class 对象获取方法

java - 如何处理防御性编程的各种情况?