Java方法中‘void’与‘<T> void’的区别是什么?
两个Java方法中
<T> void与void的区别 先看两个方法的代码:
第一个合法的泛型方法:
public static <T> void myMethod(int a, Consumer<T> consumer) { // Some code }
第二个存在编译错误的方法:
// 编译报错:找不到符号T public static void myMethod(int a, Consumer<T> consumer) { // Some code }
两者的核心区别如下:
泛型参数的定义合法性
第一个方法里的<T>是方法级的泛型声明,专门为这个方法定义了泛型类型参数T,后面参数里的Consumer<T>能正常识别这个T,整个方法可以正常编译运行。第二个方法没有提前声明
<T>,直接在Consumer<T>里用T,编译器会把T当成一个普通类名,但如果项目里没有名为T的实际类,就会直接报“找不到符号”的错误——因为T没有被定义,不属于任何合法的类型。泛型的作用范围
<T> void里的<T>属于当前方法私有,调用方法时可以手动指定具体类型,或者让编译器自动推断,比如:// 手动指定T为String myMethod(10, (String str) -> System.out.println(str)); // 编译器自动推断T为Integer myMethod(20, num -> System.out.println(num + 1));而第二个方法因为没有声明泛型参数,就算
T是所在类的泛型参数,由于方法是static的,静态方法也无法访问类的非静态泛型参数,依然会报错。方法的可用性
第一个是标准的泛型方法,完全合法可用;第二个方法存在语法错误,根本无法通过编译,更不能被调用。
内容的提问来源于stack exchange,提问作者Sahil Parekh
相关产品推荐
相关产品推荐

