Java 类型不匹配:无法从集合转换<;频道>;到Iterable<;ICleanable>;
Java上下文: 类别:Java 类型不匹配:无法从集合转换<;频道>;到Iterable<;ICleanable>;,java,generics,interface,parameter-passing,type-mismatch,Java,Generics,Interface,Parameter Passing,Type Mismatch,Java上下文: 类别:频道实现ICleanable 变量:Set channels=new HashSet() 我需要使用Iterable数组作为参数调用此方法: void unexport(Iterable<ICleanable>[] cleanables) void unexport(Iterable[]可清洗) 但是我想不出怎么写这个电话。此版本不起作用: unexport(new Iterable<ICleanable>[] { channels }) u
频道实现ICleanable
变量:
Set channels=new HashSet()
我需要使用Iterable
数组作为参数调用此方法:
void unexport(Iterable<ICleanable>[] cleanables)
void unexport(Iterable[]可清洗)
但是我想不出怎么写这个电话。此版本不起作用:
unexport(new Iterable<ICleanable>[] { channels })
unexport(新的Iterable[]{channels})
编译器说:“类型不匹配:无法从Set转换为Iterable
”
如有帮助(和/或参考学习材料),将不胜感激。谢谢
编辑。现在我已经得到了答案,我可以总结我错在哪里了 我对泛型和子类型有问题。这是一个初学者的错误(这正是我想要的)。线索:
List ls=new ArrayList();
列表lo=ls;//非法,列表不是列表!
添加(新对象());
字符串s=ls.get(0);//尝试将对象指定给字符串!
列表
不能是列表
否则类型安全无效。
这是可以解释的
我对泛型数组还有第二个问题
unexport(new Iterable<ICleanable>[] { channels })
unexport(新的Iterable[]{channels})
无法创建Iterable的数组。这是可以解释的。类型转换错误使编译器无法在更正前检测到第二个错误
就我而言,我的结局是:
void unexport(List<List<? extends ICleanable>> cleanables) {...}
Channel implements ICleanable;
List<Channel> channels = new ArrayList<>();
List<List<? extends ITVCleanable>> list = new ArrayList<>();
list.add(channels);
unexport(list);
void unexport(List您正在尝试创建一个atnew Iterable[]
。您不能直接创建泛型数组,因此可以执行以下操作:
unexport((Iterable<ICleanable>[]) new Iterable[] { channels });
unexport((Iterable[])新Iterable[]{channels});
通道.迭代器();
有效吗?等等,为什么它是一个Iterable[]
?你也在尝试在那里创建泛型数组。@doctorlove。根据你的建议:无法从迭代器转换为Iterable
。在这个方法中,我想处理一个大小未知的列表(Iterable集合)。我曾想过使用…但它会创建一个堆污染门,因此array.Channel实际上扩展了UnicastRemoteObject并实现了ICleanable。该方法只对ICleanable功能感兴趣。泛型=参数化类型+参数化方法+通配符。易于理解的概念。但泛型似乎不适合Java的其他部分:大量的限制、例外和特殊情况导致了一个大的意大利面盘。这些情况没有什么意义,或者不一致,因此很难记住。对这些情况的简短而全面的介绍,以及它们存在的合理性,将优于对特定ca的多个不完整的解释se.有人知道这样的总结吗?谢谢!啊,如果我能一劳永逸地得到这个:-)
unexport((Iterable<ICleanable>[]) new Iterable[] { channels });