程序员

Java——泛型

2019-02-25  本文已影响17人  剑起长歌

概念:


示例:

public class GenClass<T>{
//T 代表data的数据类型,在初始化的时候需要传入(String,Integer...)
    T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

调用:

 public void main(String[] args){
 //这里初始化,传入数据类型为String
    GenClass<String> class1 = new GenClass<String>();
    class1.setData("zhangsan");
    System.out.println(class1.getData());
}

特点:

  1. 泛型的类型参数可以是泛型类
  2. 泛型类可以同时设置多个类型参数,用“,”隔开
  3. 泛型类可以继承泛型类
  4. 泛型类可以实现泛型接口

示例:
新建一个类

class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
   public static void main(String[] args) {
   //实例化时,传入的类型是泛型类
     GenClass<GenClass<Student>> gen1 = new GenClass<GenClass<Student>>();
    GenClass<Student> gen2 = new GenClass<Student>();
    gen2.setData(new Student("zhangsan"));
    gen1.setData(gen2);
    System.out.println(gen1.getData().getData().getName());
   }

再新建一个泛型类,有两个类型参数:

public class GenClass1<T,P> {

    private T data1;
    private P data2;

    public  GenClass1(T data1,P data2) {
        this.data1 = data1;
        this.data2 = data2;
    }
    public T getData1() {
        return data1;
    }

    public P getData2() {
        return data2;
    }
}

调用:

  public static void main(String[] args) {
  //这里传入参数类型,第一个为String,第二个为Integer
    GenClass1<String,Integer> gen = new GenClass1<String,Integer>("zhangsan",10);
    System.out.println(gen.getData1() + "  " + gen.getData2());
  }

新建一个泛型接口

interface GenInterface<T,T1>{
    void ShowData(T data1,T1 data2);
}

新建一个泛型类GenClass2继承之前创建的GenClass和刚刚创建的泛型接口GenInterface:


class GenClass2<T, T1> extends GenClass implements GenInterface{
    T1 data1;
    public GenClass2(T data, T1 data1) {
        super();
        this.data = data;
        this.data1 = data1;
    }

    public T1 getData1() {
        return data1;
    }

    @Override
    public void ShowData(Object data1, Object data2) {
        System.out.println(data1 + "  " + data2);
    }
}

调用:

  public static void main(String[] args) {
  //这里传入参数类型,第一个为String,第二个为Integer
    GenClass2<String,Integer> gen = new GenClass2<String,Integer>("zhangsan",10);
    gen.ShowData(gen.getData(), gen.getData1());
  }

限制泛型使用类型:


示例:
创建一个动物 Animal 接口,接口里面有一个eat方法:

interface Animal {
    void eat();
}

创建一个Dog类实现Animal接口:

class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("啃骨头");
    }
}

创建一个Cat类也实现Animal接口:

class Cat implements Animal {

    @Override
    public void eat() {
        System.out.println("吃鱼");
    }
}

创建泛型类,限制泛型可用类型:

//泛型类所接受的类型做了限制,只能接受实现Animal接口的类或子类
class GenericClass<T extends Animal>{

   private T obj;

    public void setObj(T obj) {
        this.obj = obj;
    }

    public T getObj() {
        return obj;
    }
}

调用:

  public static void main(String[] args) {
  //这里传入的数据类型是能是实现Animal接口的类或其子类
        GenericClass<Dog> dogclass = new GenericClass<>();
        dog.setObj(new Dog());
        dog.getObj().eat();

        GenericClass<Cat> catclass = new GenericClass<>();
        cat.setObj(new Cat());
        cat.getObj().eat();

    }

类型通配声明:

 GenericClass<Dog> dogclass = new GenericClass<>();
 GenericClass<Cat> catclass = new GenericClass<>();
 dogclass = catclass;

将会编译报错,catclass不能赋值给dogclass。

 GenericClass<Dog> dogclass = new GenericClass<>();
 GenericClass<?> animal = dogclass;
GenericClass<Dog> dogclass = new GenericClass<>();
//这里animal只能引用类型为Animal的子类对应的GenericClass
GenericClass<? extends Animal> animal = dogclass;
GenericClass<Dog> dogclass = new GenericClass<>();
//这里animal只能引用类型为Cat或其父类型所对应的GenericClass
 GenericClass<? super Cat> animal = cat;

以上就是Java泛型的基本应用。

上一篇 下一篇

猜你喜欢

热点阅读