Java 列表初始化时出现奇怪错误

Java 列表初始化时出现奇怪错误,java,generics,Java,Generics,我的一个朋友问我是否可以帮他找出他在一段代码上出错的原因,最重要的是,他添加代码时错误消失的原因。我已经查阅了关于这些课程的文档,也没有找到原因 代码如下: import java.util.Arrays; import java.util.List; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class Test { public

我的一个朋友问我是否可以帮他找出他在一段代码上出错的原因,最重要的是,他添加代码时错误消失的原因。我已经查阅了关于这些课程的文档,也没有找到原因

代码如下:

import java.util.Arrays;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Test {

    public static void main(String[] args) {
        /**
        * This line shows this compilation error in eclipse:
        * Type mismatch: cannot convert from 
        *     List<Class<? extends JComponent&Accessible>> 
        *          to List<Class<? extends JComponent>>
        */
        List<Class<? extends JComponent>> listComp = Arrays.asList(JTabbedPane.class, 
                                                                   JPanel.class);

        /**
        * This one compiles fine and the difference is that
        * he added JComponent.class on the list and the 
        * code is working fine
        */
        List<Class<? extends JComponent>> listComp2 = Arrays.asList(JTabbedPane.class, 
                                                                    JPanel.class, 
                                                                    JComponent.class);
    }

}

我可以在Java7中重复这个问题,但是当我切换到Java8时,不再给出错误。另外,如果我继续使用Java 7,但是我给了
Arrays.asList
一个类型参数,则不再给出错误

List<Class<? extends JComponent>> listComp =
    Arrays.<Class<? extends JComponent>>asList(JTabbedPane.class, JPanel.class);

listware在IntelliJ和Java 8.Hmmm中编译得很好,可能是jdk 7上的某种错误?O.OType推断在Java 8中发生了更改,答案可能是:这是一个陷阱:
结果是编译器可以从所有类型中获得的最完整、最特定的类型
谢谢,精彩的解释。这也应该起作用:
…=asList((JComponent)JTabbedPane.class,JPanel.class)
Hi@StephenC,你在使用Java8吗?在java 7 update 80中,我在代码中遇到了这个错误:
类型不匹配:无法从一个列表转换到另一个列表
List<Class<? extends JComponent>> listComp =
    Arrays.<Class<? extends JComponent>>asList(JTabbedPane.class, JPanel.class);