Tag: multiple bounds

Java编译器如何为具有多个边界的参数化类型选择运行时类型?

我想更好地理解当Java编译器遇到如下方法的调用时会发生什么。 void printType(T… args) { System.out.println(args.getClass().getComponentType().getSimpleName()); } // printType() prints “AutoCloseable” 我很清楚,在运行时没有类型 ,所以编译器做了它可以做的最不对的事情,并创建一个类型为两个边界接口之一的数组,丢弃另一个。 无论如何,如果切换接口的顺序,结果仍然是相同的。 void printType(T… args) { System.out.println(args.getClass().getComponentType().getSimpleName()); } // printType() prints “AutoCloseable” 这导致我做了一些调查,看看接口发生变化时会发生什么。 在我看来,编译器使用某种严格的顺序规则来决定哪个接口是最重要的 ,并且接口在代码中出现的顺序不起作用。 // “AutoCloseable” // “AutoCloseable” // “Serializable” // “Serializable” // “SafeVarargs” // “SafeVarargs” // “Channel” // “Channel” // “Channel” 问题:当存在多个边界时,Java编译器如何确定参数化类型的varargs数组的组件类型? 我甚至不确定JLS是否对此有所说明,而且我通过谷歌搜索发现的任何信息都没有涵盖这一特定主题。