Java 使用有界泛型编译lambda时出错
下面是我创建的一个精心设计的、自成一体的示例,它演示了我在一个复杂得多的程序中遇到的一个问题:Java 使用有界泛型编译lambda时出错,java,generics,lambda,Java,Generics,Lambda,下面是我创建的一个精心设计的、自成一体的示例,它演示了我在一个复杂得多的程序中遇到的一个问题: public class MyTest { public static void main(String[] args) { SubObject[] array = new SubObject[5]; Iterator<? extends SuperObject> iterator = Arrays.asList((
public class MyTest {
public static void main(String[] args) {
SubObject[] array = new SubObject[5];
Iterator<? extends SuperObject> iterator
= Arrays.asList((SuperObject[]) array).iterator();
Iterable<? extends SuperObject> iterable = () -> iterator;
}
}
class SuperObject {};
class SubObject extends SuperObject{};
公共类MyTest{
公共静态void main(字符串[]args){
子对象[]数组=新的子对象[5];
迭代器多亏了@Radiodef的评论,我才明白了这一点。如中所述,诀窍是使用一个helper函数:
public class MyTest4 {
public static void main(String[] args) {
SubObject[] array = new SubObject[5];
Iterator<? extends SuperObject> iterator
= Arrays.asList((SuperObject[]) array).iterator();
Iterable<? extends SuperObject> iterable = getIterable(iterator);
}
static <T> Iterable<T> getIterable(Iterator<T> iterator) {
return () -> iterator;
}
}
class SuperObject {};
class SubObject extends SuperObject{};
公共类MyTest4{
公共静态void main(字符串[]args){
子对象[]数组=新的子对象[5];
IteratorMay我只是问为什么拥有Iterator
和Iterable
会破坏程序的用途?考虑一个超级容器类和一组扩展超级容器的子容器类。超级容器定义了一个抽象Iterable()方法返回一个Iterable。每个子容器包含一个扩展小部件的类的数组,并实现Iterable()以在数组上返回一个Iterable。如果子容器中的数组是使用ArrayList实现的,我似乎无法创建一个可以由Iterable()返回的Iterable,即Iterable。无法将ArrayList强制转换为ArrayList。若要继续:但如果Iterable()返回一个Iterable,则一切都会正常。您的示例有点复杂。您可以这样演示相同的问题:Iterator Iterator=Collections.emptyIterator();Iterable Iterable=()->iterator;
无论哪种方式,该示例都是为了演示错误,但不是为什么它实际上是一个问题。您能否详细说明上面的示例用例,以便我们了解您真正想要做什么?有趣的观察结果。如果您可以编写“带类型参数的lambda”在Java中,可以内联执行相同的操作:iterator注意,第一条语句中强制转换的类型已过时;您可以简单地执行iterator,并且仅对记录执行Iterable
public class MyTest4 {
public static void main(String[] args) {
SubObject[] array = new SubObject[5];
Iterator<? extends SuperObject> iterator
= Arrays.asList((SuperObject[]) array).iterator();
Iterable<? extends SuperObject> iterable = getIterable(iterator);
}
static <T> Iterable<T> getIterable(Iterator<T> iterator) {
return () -> iterator;
}
}
class SuperObject {};
class SubObject extends SuperObject{};