泛型方法主要用于容器类,Java中任何方法,包括静态的和非静态的,均可以用泛型来定义,而且和所在类是否是泛型没有关系,那Java
泛型方法怎么定义?下面来我们就来给大家讲解一下Java 定义泛型方法。
1.如果你定义了一个泛型(类、接口),那么Java规定,你不能在所有的静态方法、静态初块等所有静态内容中使用泛型的类型参数。例如:
public class A { public static void func(T t) { //报错,编译不通过 } }
2.如何在静态内容(静态方法)中使用泛型,更一般的问题是,如果类(或者接口)没有定义成泛型,但是就想在其中某几个方法中运用泛型(比如接受一个泛型的参数等),该如何解决?
定义泛型方法就像定义泛型类或接口一样,在定义类名(或者接口名)的时候需要指定我的作用域中谁是泛型参数。例如:public class A { ... }表明在类A的作用域中,T是泛型类型参数。
定义泛型方法,其格式是:修饰符 <类型参数列表> 返回类型 方法名(形参列表) { 方法体 }。例如:public static int func(List list, Map map) { ... },其中T和S是泛型类型参数。
泛型方法的定义和普通方法定义不同的地方在于需要在修饰符和返回类型之间加一个泛型类型参数的声明,表明在这个方法作用域中谁才是泛型类型参数;
不管是普通的类/接口的泛型定义,还是方法的泛型定义都逃不出两大要素:
明哪些是泛型类型参数;
这些类型参数在哪里使用。
3.类型参数的作用域:
class A { ... }中T的作用域就是整个A;
public func(...) { ... }中T的作用域就是方法func;
类型参数也存在作用域覆盖的问题,可以在一个泛型模板类/接口中继续定义泛型方法,例如:
class A {
// A已经是一个泛型类,其类型参数是T
public static void func(T t) {
// 再在其中定义一个泛型方法,该方法的类型参数也是T
}
}//当上述两个类型参数冲突时,在方法中,方法的T会覆盖类的T,即和普通变量的作用域一样,内部覆盖外部,外部的同名变量是不可见的。//除非是一些特殊需求,一定要将局部类型参数和外部类型参数区分开来,避免发生不必要的错误。
4.泛型方法的类型参数可以指定上限,类型上限必须在类型参数声明的地方定义上限,不能在方法参数中定义上限。规定了上限就只能在规定范围内指定类型实参,超出这个范围就会直接编译报错。
void func(List list){ ... },正确
void func(T t){ ... },正确
void func(List list){ ... } ,编译错误
其实java泛型方法理解为方法的参数类型是泛型,而不是具体的参数,这里大家要注意的就是方法的参数是泛型,而不是方法的返回值。最后大家如果想要了解更多java常见问题知识,敬请关注奇Q工具网。
推荐阅读: