Java泛型

目录

为什么用泛型

什么是泛型

代码

泛型类

代码一

代码二

从泛型类派生子类

子类 

方式一

方式二

泛型接口 

定义:

子类:

类型擦除

定义

代码

运行


为什么用泛型

早期的Object类型可以接收任意的对象类型,但是在实际的使用中, 会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这 个安全问题。

什么是泛型

泛型 类型不确定,可以把类型当做参数传递进来

代码

package com.ffyc.javacollection.fx;

import java.lang.reflect.Field; 
public class Demo<T> {
    T account;//105560 cfgct225

    public T getAccount() {
        return account;
    }

    public void setAccount(T account) {
        this.account = account;
    }

    public static void main(String[] args) throws NoSuchFieldException {
        Demo<String> demo1 = new Demo<>();
        demo1.setAccount("agge545s7d0");
        demo1.getAccount();

        Demo<Integer> demo2 = new Demo<>();
        demo2.setAccount(155787);
        demo2.getAccount();
    }

}

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开 放相同的接口。

代码一

package com.ffyc.javacollection.fx;

public class MyArray1 {
    Object[] object = new Object[30];
    public void add(Object obj){

    }

    public Object get(){

        return 1;
    }

    public static void main(String[] args) {
        //MyArray 里面定义了一个Object类型的数组,可以存储任何数据类型
        MyArray1 myArray = new MyArray1();
        myArray.add("abc");
        myArray.add(true);
        myArray.add(1);

        Object obj = myArray.get();
        if(obj instanceof String){
            String str = (String)obj;
            str.length();
        }
    }
}

代码二

          在定义时,为类指定类型,在编译期间添加数据时,进行类型检验 
          1、泛型的类型参数只能是类类型
          2、泛型的类型参数可以有多个
          3、如果没有定义具体类型,默认为Object 

package com.ffyc.javacollection.fx;


             //<A> 可以是任意的标识符,可以定义多个泛型
public class MyArray2<A,B> {

    A[] objects = (A[]) new Object[30];

    A name;

                 public A getName() {
                     return name;
                 }

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

                 public void add(A obj){

    }

    public A get(){
        return null;
    }

    public static void main(String[] args) { 
        MyArray2<String,Integer> myArray1 = new MyArray2();
        myArray1.add("abc");
        myArray1.get();

        MyArray2<Integer,String> myArray2 = new MyArray2();
        myArray2.add(10);
        myArray2.get();

        MyArray2 myArray3 = new MyArray2();
        myArray3.add("");
    }
}

从泛型类派生子类

package com.ffyc.javacollection.fx;

import java.lang.reflect.Field; 
public class Demo<T> {
    T account;//105560 cfgct225

    public T getAccount() {
        return account;
    }

    public void setAccount(T account) {
        this.account = account;
    }

    public static void main(String[] args) throws NoSuchFieldException {
        Demo<String> demo1 = new Demo<>();
        demo1.setAccount("agge545s7d0");
        demo1.getAccount();

        Demo<Integer> demo2 = new Demo<>();
        demo2.setAccount(155787);
        demo2.getAccount();  
    }

}

子类 

一个类继承了一个泛型类,有两种实现方式 

方式一

1、子类和父类都为泛型类,这样定义子类时,传入类型,子类中的与父类的类型一致 

package com.ffyc.javacollection.fx; 
public class A<T> extends Demo<T>{
    T password;

    public static void main(String[] args) {
        A<String> a = new A();
        a.setAccount("ancxge");

    }
}

方式二

2、子类不是泛型类,父类的泛型类型必须是确定的 

package com.ffyc.javacollection.fx; 
public class B implements Comparable<B>{

    @Override
    public int compareTo(B o) {
        return 0;
    }

    public static void main(String[] args) {
        B b = new B();
    }
}

泛型接口 

定义:

泛型接口与泛型类的定义及使用基本相同。

public interface Demo<T> { //定义一个泛型接口 }

子类:

子类也是泛型类,子类和父类的泛型类型要一致

class A<T> implements Demo<T>{ }

子类不是泛型类,父类要明确泛型的数据类型

public class A implements Demo<String> { }

类型擦除

定义

泛型的擦除: 
       虽然我们定义时,定义了明确的类型,但是实际底层处理时,统一都转为Object类型,与之前的代码兼容
       泛型意义在于,编译期间添加获取元素时,他的元素类型是统一的 

代码

package com.ffyc.javacollection.fx;

import java.lang.reflect.Field; 
public class Demo<T> {
    T account;//105560 cfgct225

    public T getAccount() {
        return account;
    }

    public void setAccount(T account) {
        this.account = account;
    }

    public static void main(String[] args) throws NoSuchFieldException { 
        Demo<Integer> demo2 = new Demo<>();
        demo2.setAccount(155787);
        demo2.getAccount(); 
        //从demo2对象中取出account属性
        Field account = demo2.getClass().getDeclaredField("account");
        //获取到属性运行时,实际的类型 
        System.out.println(account.getType()); 
    }

}

运行

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值