参数中的 Java 泛型

标签 java generics

我有以下界面:

public interface IRadioButtonGroup<T> {
 List<IRadioButton<T>> getButtons();
}

现在我创建一个方法

protected Object getDefaultRadioButtonValue(IRadioButtonGroup<?> field) {
List<IRadioButton<?>> buttons = field.getButtons();

现在java正在提示:

Type mismatch: cannot convert from List<IRadioButton<capture#1-of ?>> to List<IRadioButton<?>>

有什么建议吗?

最佳答案

方法的无界通配符参数类型意味着,它将接受 IRadioButtonGroup未知类型。编译器不知道会出现什么类型,但是在编译时,编译器确实会生成并为每个通配符分配一个占位符,因为虽然它不知道会出现哪种类型,但可以肯定的是,必须有一个单独的通配符。将替换 ? 的类型。该占位符是 capture#1-of ?您在错误消息中看到。

基本上,您正在尝试分配 List<IRadioButton<Cap#1-of-?>>List<IRadioButton<?>> ,这是无效的,以类似的方式List<List<String>>无法分配给List<List<?>> .

解决这些问题的一种众所周知的方法是使用捕获助手。基本上,您创建一个通用方法,并将调用委托(delegate)给该方法。该泛型方法将推断类型参数,然后您将能够执行类型安全操作。请参阅this Brian Goetz's article了解更多详情。

因此,要解决该问题,请提供另一种方法,如下代码所示:

protected Object getDefaultRadioButtonValue(IRadioButtonGroup<?> field) {       
    return getDefaultRadioButtonValueHelper(field);
}

private <T> Object getDefaultRadioButtonValueHelper(IRadioButtonGroup<T> field) {
    List<IRadioButton<T>> buttons = field.getButtons();
    // Write the logic of original method here
}

关于参数中的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22605082/

相关文章:

java - 哪里可以下载 Java 通信 API

c# - C# 中的继承 - 简单问题

C# 与 Java 泛型

java - 扩展通用抽象类 : Correct Bounding

java - 将几种方法组合成唯一的一种。泛型

java - 错误是 : "weblogic. application.ModuleException : java. lang.ClassNotFoundException weblogic 服务器 12.2.1

java - Android 是否有与 Java 的 Desktop.getDesktop() 类似的类用于打开文件或提示用户选择应用程序关联?

java - JVM 的 Eclipse 启动错误已终止。升级 Ubuntu 更新后退出代码=13

generics - 通用序列

java - R/RStudio、Yosemite 和 Java