【Java基础语法】如何在使用静态方法的时候指定其泛型?万分感谢!

Python023

【Java基础语法】如何在使用静态方法的时候指定其泛型?万分感谢!,第1张

举个例子:

public void f(int i, char ch, String s){}

这个方法中有三个参数,分别为int类型的i,char类型的ch,String类型的s。这三个参数的类型都已经指定了,如果实际参数类型和对应参数类型不一致,编译器会出现错误。

如何才能做到可以任意指定参数的类型呢?这个时候可以使用泛型方法。举个例子:

public <A, B, C>void f(A a, B b, C c){}

这个就是所谓的泛型方法,当向方法中传递参数后,编译器会自动推断出参数的类型,如:

f(1, "hello", 123.123)

第一个参数类型为Integer,第二个为String,第三个为Double(自动包装机制让基本类型自动包装成对应的包装类)。

泛型方法的特征就是方法前面有对尖括号<>,尖括号里面的就是类型参数,也就是说类型是个变量,要由实际的参数推断得来。

Java中的方法就是这样获取泛型能力的,还有其他方式。但是static方法比较特殊,如果要使得static方法具有反省能力就必须要使用到上面的方法。

希望能解决你的问题。

你好,我觉得最主要的原因是因为泛型擦除。

class Demo<T>{

public void add(T t) {

//...

}

}

编译后通过反编译:

D:\test>javap -s -p Demo

Compiled from "Demo.java"

public class Demo extends java.lang.Object{

public Demo()

Signature: ()V

public void add(java.lang.Object)

Signature: (Ljava/lang/Object)V

}

所以,非静态方法正是由于需要先有对象,进而在使用泛型的时候可以确定安全检查的限制条件。

Demo<String>d = new Demo<String>()

d.add("str") //这里你就只能添加String类型的。

而静态方法不需要构件对象,所以他在调用方法是,根本没有判断参数的约束条件,所以虚拟机压根就不希望这种事情发生,所以在编译时就报错了。