java范型

来源:互联网 发布:js聚合物水泥防水阴角 编辑:程序博客网 时间:2024/04/30 12:36
按照约定,类型参数名称命名为单个大写字母,以便可以在使用普通类或接口名称时能够容易地区分类型参数。以下是常用的类型参数名称列表 -

E - 元素,主要由Java集合(Collections)框架使用。
K - 键,主要用于表示映射中的键的参数类型。
V - 值,主要用于表示映射中的值的参数类型。
N - 数字,主要用于表示数字。
T - 类型,主要用于表示第一类通用型参数。
S - 类型,主要用于表示第二类通用类型参数。
U - 类型,主要用于表示第三类通用类型参数。

V - 类型,主要用于表示第四个通用类型参数。

1、类泛型

package eoa;


public class Box<T> {
private T name;


public T getName() {
return name;
}


public void setName(T name) {
this.name = name;
}


}

2、方法泛型

package eoa;


public class MethodGeneric {
public static <T> void query(T[] criteria) {


}
}

3、多边界以及继承泛型:

package eoa;


public class MutiGeneric {
public static <T extends Number & Comparable<T>> T max(T a, T b, T c) {
T max = a;
if (b.compareTo(a) > 0) {
max = b;
}
if (c.compareTo(b) > 0) {
max = c;
}
return max;
}


}

4、上限通配符

public static void ite(List<? extends Number> arr) {
for (Number n : arr) {
System.err.println(n);
}
}

5、无界通配符

public static void noBord(List<?> list){
for(Object o:list){
System.err.println(o);
}
}

6、下限通配符  只允许当前父类的实例以及当前类的实例加入,而不允许有其他

public static void border(List<? super Integer> list){
for(Object o:list){
System.err.println(o);
}
}

7、泛型参数不能用于方法中实例化:

T item = new T();

如果需要实例化,请采用如下方式:

public <T> T getEntity(Class<T> clazz) throws InstantiationException, IllegalAccessException{
T t=clazz.newInstance();
return t;
}

8、泛型参数无法使用于静态变量,因为静态变量可以在不同实例中共享。如

     private static T a;

9、不同参数化类型直接不能互转

package eoa;


public class Generic<T> {
public Generic(T name){
this.name=name;
}
private T name;


public T getName() {
return name;
}


public void setName(T name) {
this.name = name;
}


public static void main(String args[]) {
Generic<Integer> g1=new Generic<Integer>(12);
Generic<Double> g2=new Generic<Double>(12.1);
g1=g2;//抛出异常


}
}

10、不能使用instanceOf,因为编译器采用类型擦除原则(将泛型参数用Object或者限定参数替换),所以无法使用

       Generic<Integer> g1=new Generic<Integer>(12);
if(g1 instanceof Generic<Integer> ){//出错

}

11、不能声明泛型数组

Box<Integer>[] bs = new Box<Integer>[2];

        因为使用类型擦除,类型参数被转为Object或对应的下界或上界类型,所以在运行时,会抛出ArrayStoreException

12、泛型不能重载

package eoa;


import java.util.List;


class GenericBox  {
   //Compiler error
   //Erasure of method print(List<String>) 
   //is the same as another method in type Box
   public void print(List<String> firstMethod) { }
   public void print(List<Integer> secMethod) { }

}

原创粉丝点击