泛型是java语言提供的一种扩展,允许传入不同的参数,生成不同的参数的类型的对象,但是这种处理方式实在逻辑上的处理,但是在编译的的时候没有这种区别。
泛型也是分为 类泛型,方法泛型,字段泛型
public class Box <T> { //类泛型
public T data; // 字段泛型
<span style="white-space:pre"> </span>/方法泛型
public Box( T t){
this.data = t;
}
public T getData() {
return data;
}
<span style="white-space:pre"> </span>
public T fun(T t) {
return t;
}
public <S>S test(S s) {
return s;
}
public <S extends T> testExtendsS( S s) {
return s;
}
public <S extends T> testExtendsT ( T t) {
return t
}
}
上面代码中:
public T fun(T t) 和 public <S> S test(S s);
fun(T t)方法返回的参数的类型T是和类的型泛型T相关的,但是 test(S s)方法返回的参数S 是和传入的参数类型S是一致的默认的情况类型为Ojbect。
假如 public T fun(T t)方法写成 public <T> T fun (T t);那么此时返回的类型为和传入的参数 t的类型相关默认类型为Object.效果和 test(S s) 是一样的,
但是会和 public T fun(T t)混淆 所以不建议写成这样。
这里注意:
Java泛型中的标记符含义:
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的java类型
S、U、V - 2nd、3rd、4th types
上面的java 泛型中的标记含义只是建议如此,并不是在语法上用限制。
public class Box <T extends Number> {
public T data;
public List<? extends Number> n;
<span style="white-space:pre"> </span>public List<? super Number> s;
public Box( T t){
this.data = t;
}
public T getData() {
return data;
}
public T fun(T t) {
return t;
}
public <S>S test(S s) {
return s;
}
public <S extends T> testExtendsS( S s) {
return s;
}
public <S extends T> testExtendsT ( T t) {
return t
}
}
上面的类泛型 Box (T extends Number)中 extends 是指这个 T类型必须是继承自 Number的或者是本身。
假如是Box(T super Number)中的 super是指 这个T类型必须是本身或者是Number的超类直至Ojbect.
泛型中的通配符 ?的相关知识请看看 java 泛型中的有界类型
Java泛型详解