1.概述
一直在泛型这块的使用非常的浅,直到最近使用对象型数据库模式时才发现有疑惑。现在俺来详细的记录下。本文参考 java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一 # java 泛型详解
2.泛型的类别
- 普通泛型
1. 释义:设置一个标识符(一般用“type”的T表示),定义类型时可以通过外部来决定。
2. 实例:
public class Test {
public static void main(String[] args) {
Person<String> p = new Person<>();//向下转型
p.value="二小";
Person<Integer> p1 = new Person<>();
p1.value = 2;
System.out.println(" p = "+p.value +" , p1= "+p1.value);
}
}
class Person<M> {//标示符可以随意写,但会限制类别的标识符类型;
// 因声明限制,不可使用除M外的其他标示符;
//类型由M决定,即:由实例对象确定。 ps:懒了点就不封装了。
M value;
}
- 通配符
- 实例
public class Test {
public static void main(String[] args) {
Person<String> p = new Person<>();//向下转型
p.value="二小";
Person<Integer> p1 = new Person<>();
p1.value = 2;
System.out.println(" p = "+fun(p).getClass().getName() + "@" + Integer.toHexString(fun(p).hashCode()) +" , p1= "+fun(p1));
}
////泛型作为通配符的使用,当不知道要返回何种情况时处理的。
//定义的使用需要明确的标识符,为在类别中统配符的使用先做好预留和区分,但是传入时使用"?"
//可最大限度的扩展该方法的使用性。
public static Object fun(Person<?> p){
return p.value;
}
}
class Person<M> {
M value;
}
- 受限泛型
public class Test {
public static void main(String[] args) {
Person<String> p = new Person();//向下转型
p.value="二小";
Person<Integer> p1 = new Person();
p1.value = 2;
p.aa();
**这个fun(p) 会报编译错误,因p的泛型类型飞Number的子类**
System.out.println(" p = "+fun(p) +" , p1= "+fun(p1));
}
public static <T> Object fun(Person<? extends Number> p){
return p.value;
}
}
class Person<M> {
public void aa(){
System.out.println("父类方法使用");
}
}
- 无法向上转型
1.定义:因其定义的类型为不确定的。所以向上转型的可能性太多了。故而不支持向上转型。
······
Person<String> p = new Person();//向下转型
p.value="二小";
Person<Object> p1 = p;// 是会报错的。
······
- 泛型接口
1.定义:接口定义泛型,实现类可以继续使用泛型。也可以就泛型做具象化。不详述了。 - 泛型方法
1.定义:泛型方法会加上一个<T>,任意标识符均可。作用个人认为作为一个声明值。
public static <X> void fun(Person<X> p){ //ok的
public static void fun(Person<X> p){ // 报错 ,因该函数无法识别X是什么类型。
-
通过泛型方法返回泛型类型实例
-
使用泛型统一传入的参数类型
-
泛型数组
//泛型数组的返回。通过可变数组参数返回。
public static <X> X[] fun(X... params){
return params;
}
- 泛型嵌套设置
1.定义:泛型个数可以有多个,不一定只用一个泛型类型。
public class A<T,M,C>{ // 相当于声明了三个不同的泛型类型在该类中。
}
- 不一定需要通过参数来确定泛型的准确类型,可以通过返回值
网友评论