十九、泛型

2020-02-03  本文已影响0人  你的益达233

泛型

作用:可以解决数据类型的安全性问题
怎么说呢,所有类都可以向上转型为Object,但是真正用的时候就可以类型转错了。但是如果定义泛型就不会有这个问题。
比如Point《String》 p = new Point《String》()
这样只能输入字符串类型

泛型类定义格式

class 类《T》 {
修饰符 《T》 属性;
public 《T》 getter() ;

}

通过构造方法设置内容

class Point<T> {  
    private T var  
    public Point(T var){  
        this.var = var
    }

}

定义多个泛型

class Point<T,K>{    
    private T var;
    private K key;
}  

泛型的安全警告

在泛型应用中最好在声明类对象的时候指定好其内部的数据类型
如“Info<String>”,如果未指定泛型,会将T设置为Object类型,这样就可以接受所有类型

通配符?

使用?可以接收任意的内容,但是此内容却无法修改
示例代码:

Info<?> i = new Info<String>()  
i.setVar("nihao") //会报错  

受限泛型,方法和类都可以使用

《T extends Info》 :只能是Info或者其子类

泛型与子类继承的限制

一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接受。
例如:Info<String>不能使用Info<Object>
假设Info<String>是一件商品,Info<Object>是全部商品

泛型其他应用

泛型接口的定义

interface Info<T> {
    public T getVar()
}

泛型接口实现的两种方式

第一种: 示例代码

class InfoImpl<T> implements Info<T>{

}

第二种:

class InfoImpl implements Info<String>{
}

泛型方法

跟类是不是泛型类没关系
示例代码:

class Demo{  
    public <T> T fun(T t){
        return t;
    }
}  
<T>可以看着声明T是什么  

通过泛型方法返回泛型类的实例

public static <T extends Number> Info<T> fun(){
    Info<T> temp = new Info<T>()
    temp.setVar(param)
    return temp
}

泛型数组

public static <T> void fun2(T param[]){
    for(T t:param){}
}  

使用 fun2(Integer i[])

泛型的嵌套使用

Demo<Info<String,Integer>> d = null
Info<String,Integer> i = null
i = new Info<String,Integer>("wold",11)
d = new Demo<Info<String,Integer>>(i)
上一篇下一篇

猜你喜欢

热点阅读