Java 带泛型参数的主方法;它为什么有效?
所以我的问题是,为什么它仍然成功运行 注释:Java 带泛型参数的主方法;它为什么有效?,java,generics,main,type-inference,Java,Generics,Main,Type Inference,所以我的问题是,为什么它仍然成功运行 注释: 我正在用Java10.0.1测试这一点 Intellij不能很好地使用此方法,因为它不将其视为程序的入口点;我还没有用其他IDE测试过它 您还可以使用命令行传递参数,就像在其他程序中一样 这是因为类型参数有一个界限: public static <T extends String & AutoCloseable> void main(T[] args) { System.out.println("This still w
- 我正在用Java10.0.1测试这一点
- Intellij不能很好地使用此方法,因为它不将其视为程序的入口点;我还没有用其他IDE测试过它
- 您还可以使用命令行传递参数,就像在其他程序中一样
- 这是因为类型参数有一个界限:
public static <T extends String & AutoCloseable> void main(T[] args) {
System.out.println("This still works!");
}
边界中类型的顺序仅在擦除时才有意义
类型变量的类型由其边界中的第一个类型确定,并且
类类型或类型变量只能出现在第一个
位置
@Li357只有第一个绑定对擦除类型有贡献代码>和必需的
抛出异常
声明,程序仍然在编译时没有任何警告,并且在运行时失败,因为字符串
无法强制转换为自动关闭
@wchargin:很好!但是我认为编译器没有发出任何警告并不奇怪,因为定义一个不打算作为入口点的main
方法是合法的。(根据我的经验,没有编译器会发出类似于publicstaticvoidmain()
的警告)main
的调用方式与反射方式类似,有效地避免了静态类型系统在运行时未具体化的任何方面。@wchargin您不会显式调用main
方法;如果您试图从代码中执行此操作(传递的参数未实现自动关闭
接口),则会出现不兼容边界
编译器错误。您的答案尽管正确,但需要更多解释。
public static <T extends String & AutoCloseable> void main(T[] args) {
System.out.println("This still works!");
}
<T extends String> => String
<T extends String & AutoCloseable> => String & AutoCloseable
public static main([Ljava/lang/String;)V