我有以下界面:
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/