基本语法
修饰符 <T,R...> 返回类型 方法名(参数列表) { }
注意细节
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中。
- 当泛型方法被调用时,类型会确定。
- public void eat(E e) { },修饰符后没有<T,R..> eat方法不是泛型方法,而是使用了泛型。
应用案例
public class Exercise07 {
public static void main(String[] args) {
Car car = new Car();
car.fly("jack",20);//当调用方法,传入参数,编译器就会确定类型,T是String类,R是Integer类
car.fly(100,100.1);//当调用方法,传入参数,编译器就会确定类型,T是Integer类,R是Double类
//测试
fish<String, Integer> fish1 = new fish<>();
fish1.hello(20,11.2);
}
}
//泛型方法,可以定义在普通类中,也可以定义在泛型中
class Car{
public void run() { //普通方法
}
// <T,R>就是泛型,提供给fly使用
public <T,R> void fly(T t,R r) { //泛型方法
}
}
class fish<T,R>{
public void run() { //普通方法
}
public <U,M> void fly(U u,M m) { //泛型方法
}
//说明
// 1.下面hi方法不是泛型方法
// 2.是hi方法使用了类声明的泛型
public void hi(T t) {
}
//泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
public<K> void hello(R r,K k) {
System.out.println(r.getClass()); //输出运行类型为:Integer
System.out.println(k.getClass()); //输出运行类型为:Double
}
}
泛型方法练习
public class Exercise08 {
public static void main(String[] args) {
//下面代码输出什么?
Apple<String, Integer, Double> apple= new Apple<>();
apple.fly(10); //10会被自动装箱Integer10,输出Integer
apple.fly(new Dog()); //Dog
}
}
class Apple<T,R,M>{
public<E> void fly(E e){ // 泛型方法
System.out.println(e.getClass().getSimpleName());
}
//public void eat(U u){} 错误,因为 U没有声明
public void run(M m){}
}
class Dog {}
输出:
Integer
Dog