资讯专栏INFORMATION COLUMN

Java泛型

snowLu / 2125人阅读

摘要:定义什么是泛型,看表面的意思,泛型就是指广泛的普通的类型。继承关系泛型类在继承时,可以明确父类泛型类的参数类型,也可以不明确。参考资料泛型就是这么简单

1、定义

什么是泛型,看表面的意思,泛型就是指广泛的、普通的类型。在java中是指把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
可一看一个简单的例子:

List strings = new ArrayList();
strings.add("a String");
String aString = strings.get(0);

可以看到,通过菱形语法("<>")可以将List内元素的类型限定为String类型。
需要注意的是<>内的类型只能是引用类型,当然对于基本类型,可以使用对应的包装类型

2、使用泛型的好处

(1)首先就像上面那个例子一样,使用泛型能够限定集合中,如List, Set中元素的类型,保证一个集合中只有一个类型。(这样也就能够使用增强for来遍历集合
(2)程序也能更加健壮(只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常)

3、泛型的基础

(1)泛型类

泛型类也就是把泛型定义在类上,这样用户在使用类的时候才把类型给确定下来。

public class ObjectTool {
    private T obj;

    public T getObj() {
        return obj;
    }

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

可以看到上面这个程序,在使用时如果定义了类型,那么在使用时就可以不用进行强制类型转换,直接就可以得到一个T类型的对象。

(2)泛型方法
有时候只关心某个方法,那么使用泛型时可以不定义泛型类,而是只定义一个泛型方法,如下

 public  void show(T t) {
        System.out.println(t);
    }

需要注意一下定义的格式,泛型必须得先定义才能够使用。

(3)继承关系
泛型类在继承时,可以明确父类(泛型类)的参数类型,也可以不明确。
现在我们有如下的泛型类
//泛型类

public interface Inter {
    public abstract void show(T t);
}

①明确类型
//在实现泛型类时明确父类的类型

public class InterImpl implements Inter {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}

②不明确类型

public class InterImpl implements Inter {

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}
(4)类型通配符

(1)无界
类型通配符我感觉上和泛型方法差不多,只是不用在使用前进行定义,例子如下:

public void processElements(List elements){
   for(Object o : elements){
      System.out.println(o);
   }
}

"?"可以接收任何类型。
(2)上界

public void processElements(List elements){
   for(A a : elements){
      System.out.println(a.getValue());
   }
}

这种情况下能够接收A类或者A类的子类。
(3)下界

public static void insertElements(List list){
    list.add(new A());
    list.add(new B());
    list.add(new C());
}

这种情况下能够接收A类或者A类的父类

(4)类型通配符和泛型方法

我认为这两种方式是差不多的,不过在使用时,如果参数之间是有依赖关系的,那么可以使用泛型方法,否则就使用类型通配符。(如果一个方法的返回值、某些参数的类型依赖另一个参数的类型就应该使用泛型方法,因为被依赖的类型如果是不确定的?,那么其他元素就无法依赖它)

(5)开发相关

泛型通配符< ? extends T >来接收返回的数据,此写法的泛型集合不能使用 add 方  法, 而< ? super T >不能使用 get 方法,做为接口调用赋值时易出错。

这个怎么来理解呢,当我们使用extends时,我们可以读元素,因为元素都是A类或子类,可以放心的用A类拿出。
当使用super时,可以添加元素,因为都是A类或父类,那么就可以安全的插入A类。

参考资料:https://segmentfault.com/a/11... 泛型就是这么简单

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75040.html

相关文章

  • java编程思想》—— 泛型

    摘要:引用泛型除了方法因不能使用外部实例参数外,其他继承实现成员变量,成员方法,方法返回值等都可使用。因此,生成的字节码仅包含普通的类,接口和方法。 为什么要使用泛型程序设计? 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类的对应类型;如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----摘自原书Ordinary classes and meth...

    CODING 评论0 收藏0
  • Java知识点总结(Java泛型

    摘要:知识点总结泛型知识点总结泛型泛型泛型就是参数化类型适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是模版优点使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。 Java知识点总结(Java泛型) @(Java知识点总结)[Java, Java泛型] [toc] 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛...

    linkin 评论0 收藏0
  • 聊聊Java泛型及实现

    摘要:静态变量是被泛型类的所有实例所共享的。所以引用能完成泛型类型的检查。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。事实上,泛型类扩展都不合法。 前言 和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基本类型作为模板参数,Java却只能接受类作为泛型参数;Java可以在泛型类的方法中取得...

    lewif 评论0 收藏0
  • 浅析Java泛型

    摘要:泛型类在类的申明时指定参数,即构成了泛型类。换句话说,泛型类可以看成普通类的工厂。的作用就是指明泛型的具体类型,而类型的变量,可以用来创建泛型类的对象。只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,...

    godiscoder 评论0 收藏0
  • 初探Java类型擦除

    摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...

    DevTalking 评论0 收藏0

发表评论

0条评论

snowLu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<