为了账号安全,请及时绑定邮箱和手机立即绑定

Java泛型该怎么使用

Java泛型该怎么使用

弑天下 2018-06-24 10:50:59
看的视频中虽然已经讲出了,但是还是希望有字面的解释能容易理解些,具体泛型怎么用,希望指点。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

具体使用方法~

1、定义泛型类

在定义带泛型的类时,在紧跟类命之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。

定义完泛型后,可以在定义位置之后的类的几乎任意地方(静态块,静态属性,静态方法除外)使用泛型,就像使用普通的类型一样。

注意,父类定义的泛型不能被子类继承。

例:

//自定义一个泛型
public class MyGenerics <T1,T2 > {
    private T1 param1;    
    private T2 param2;    
    public T1 getParam1() {
            return param1;    
    }    
    public void setParam1(T1 param1) {
            this.param1 = param1;    
    }    
    public T2 getParam2() {        
            return param2;    
    }    
    public void setParam2(T2 param2) {
            this.param2 = param2;    
    }
}

使用自定义的泛型:

public static void main(String[] args) {    
    //使用自定义的泛型
    MyGenerics <Integer, String > myGenerics = new MyGenerics <Integer, String >();
    myGenerics.setParam1(1);
    myGenerics.setParam2("abc");
}

注意:如果一个泛型函数在一个泛型类里面出现,最好避免在方法的泛型和类的泛型中使用同样的名字来避免混淆。对内部类也是同样。

2、定义带泛型方法

在定义带泛型的方法时,在紧跟可见范围修饰(例如public)之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。

 定义完泛型后,可以在定义位置之后的方法的任意地方使用泛型,就像使用普通的类型一样。

 例如:

 public <T, S extends T > T testGenericMethodDefine(T t, S s){
       ...
 }

 注意:定义带泛型的方法,主要目的是为了表达多个参数以及返回值之间的关系。

3、通配符

类型的通配声明:

可以使用“?”通配字元,并使用extends关键字限定持有者的类型。

声明一个类型时进行限定:

例:

public static void main(String[] args) {
    //使用’?’通配字元,并使用extends关键字限定持有者的类型
    MyGenerics <? extends Object, ? extends List <String > > myGenerics = null;    
    //创建满足类型要求的对象    
    myGenerics = new MyGenerics <String, ArrayList <String > >();    
    //以下是不符合通配要求的因为HashMap没有实现List    
    //myGenerics = new MyGenerics <String, HashMap >();    
    //给泛型的泛型赋值    
    MyGenerics3 <? extends Object, ? extends List <String > > myGenerics3 = null;    
    myGenerics3 = new MyGenerics3 <Object, List <String > >();    
    //可以设置为null    
    myGenerics3.setMyGenerics(null);
}
MyGenerics3 <?, ? > myGenerics3 = null;

等价于:

MyGenerics3 <? extends Object, ? extends Object > myGenerics5 = null;

4、数组范型

可以使用带范型参数值的类声明数组,却不可有创建数组,不能使用new关键字创建T类型的对象,而应该传递一个具体的参数类型,如下面的将编译不通过:

MyGenerics <Integer, String > myGenerics = new MyGenerics <T1, T2 >();

例:

public class MyGenerics2 <T > {
    private T[] param1;    
    public T[] getParam1() {
            return param1;    
    }    
    public void setParam1(T[] param1) {
            this.param1 = param1;    
    }

5、使用泛型的好处:

如果使用了泛型,只要代码在编译时没有出现警告信息,就不会遇到运行时的ClassCastException异常。


查看完整回答
1 反对 回复 2018-07-13
  • 1 回答
  • 0 关注
  • 1039 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信