参数中的Java泛型

马蒂亚斯

我有以下界面:

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<?>>

有什么建议么?

罗希特·贾恩(Rohit Jain)

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

基本上,您尝试将a分配List<IRadioButton<Cap#1-of-?>>List<IRadioButton<?>>,这是无效的,其方式类似于List<List<String>>无法分配给的方式List<List<?>>

解决这些问题的一种众所周知的方法是使用捕获助手基本上,您将创建一个通用方法,并将调用委派给该方法。该通用方法将推断出type参数,然后您便可以进行类型安全的操作。有关更多详细信息,请参见Brian Brian的这篇文章

因此,要解决此问题,请提供以下代码中的另一种方法:

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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章