Java 泛型

2018-05-06  本文已影响0人  ninedau

1.概述

一直在泛型这块的使用非常的浅,直到最近使用对象型数据库模式时才发现有疑惑。现在俺来详细的记录下。本文参考 java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一 # java 泛型详解

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;
}
  1. 实例
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("父类方法使用");
    }
}
······
        Person<String> p = new Person();//向下转型
        p.value="二小";
        Person<Object> p1 = p;// 是会报错的。
······
  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;
    }
public class A<T,M,C>{  // 相当于声明了三个不同的泛型类型在该类中。
}
上一篇 下一篇

猜你喜欢

热点阅读