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{};