博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习点滴——泛型
阅读量:6075 次
发布时间:2019-06-20

本文共 1850 字,大约阅读时间需要 6 分钟。

基于《Java编程思想》第四版

前言

虽然Java的泛型在语法上和C++相比是类似的,但在实现上两者是全然不同的。

语法

Java只需要一个<>就可定义泛型。在<>中可以使用任意符合Java语法要求的字符作为类型的标识,可以定义泛型类、泛型接口、泛型方法等。

class A
{ T a; public
void foo(Q a){ }}interface B
{ void foo(T a);}

实现

Java的泛型并不像C++那样是在编译时根据需要按照模板实例化对应的类。比如下面这段C++代码,会以A为模板实例化两个类。

template
class A {public: A(){} T a; };int main(){ A
a; A
b; return 0;}

查看汇编可以证实,调用的是两个不同类的构造函数

0x0000000000400545 <+15>:    callq  0x40056c 
::A()> 0x0000000000400551 <+27>: callq 0x400578
::A()>

Java中所有类都继承自Object,任意类对象都可以向上转型后,使用Object变量存储其引用。基于这一点,Java的泛型实现时其实只有一种类型。以下两个类实际是等同的

class A
{ T a;}class A{ Object a;}

当使用反射机制获取泛型类的信息时,可以发现class A<T>实际就是class A

public static void main(String[] args) {    A
a = new A(); Field[] f = a.getClass().getDeclaredFields(); System.out.println(Arrays.toString(f));}// 输出为 [java.lang.Object A.a]

由此我们也可以知道为什么下面这段代码总是输出same class

public static void main(String[] args) {    A
a = new A(); A
b = new A(); if( a.getClass() == b.getClass() ){ System.out.println("same class"); }}

因为基础类型并不继承自Object,所以Java的泛型是不支持基础类型的。如果这么做了,就会得到一个错误提示Type argument cannot be of primitive type

自限定类型

因为使用泛型时,其类型参数会被当做Object来处理,所以编译器就无法感知真实类型的方法了。

比如下面这段代码,就无法通过编译

class A{    public void foo(){        System.out.println("A.foo()");    }}class B
{ T a; B(T a){ this.a = a; } public bar(){ a.foo(); // 此处会提示编译错误,Object类型不存在foo()方法 }}

此时必须将泛型类B的类型参数做限定,让编译器能从限定中获取到足够的信息去判断类型参数是存在foo()方法的。

class B
{ T a; B(T a){ this.a = a; } public bar(){ a.foo(); }}

转载于:https://www.cnblogs.com/yizui/p/10710435.html

你可能感兴趣的文章
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>