【Effective Java 3 读书笔记】【泛型】【条目1】不要使用原始类型

名词定义

  1. 泛型类型(generic type)
    如果一个类或者接口,声明了一个或者多个类型参数,那么这个类称为泛型类,接口称为泛型接口,它们都统称为泛型类型
    例如List ,E为形式类型参数(形参),表示列表中元素的类型。

  2. 参数化类型(parameterized types)
    类或接口名称,后面加上<>, 同时在<>里面列出实际的类型参数
    例如 List< String >, String为实际类型参数(实参)

  3. 原始类型(raw type)
    每个泛型类型同时定义了一个原始类型,即没有任何类型参数
    例如 List

条目1 不要使用原始类型

使用泛型会使代码更安全,更易懂
原始类型的存在,只是为了保持向前兼容

问题: 当不使用原始类型的情况下,元素为任何类型的容器该如何表示呢?
答案:使用Object作为实际类型参数
例如List< Object >

List< Object >和List的区别
你可以把List< String>作为参数,传递给一个参数类型为List的方法;
但是不能把List< String >作为参数,传递给一个参数类型为List< Object >的方法
这是因为List< String >是List的子类, 但不是参数化类型List< Object >的子类

问题:当容器的参数类型是未知的,如何声明其类型?
答案:使用类型通配符 ?
例如List<?>
下面的方法,即可以接受List< String >作为其参数,也可以接受List< Integer >作为其参数
void foo(List<?> list)

使用通配符的容器与原始类型的区别:
通配符容器是类型安全的,但是原始类型不是

  1. 原始类型容器可以添加任何对象;
  2. 通配符容器只能添加null,其他任何对象都不能添加进容器;否则会破坏容器的类型一致性

需要使用原始类型的地方

  1. instanceof关键字
    if( o instanceof List)
    不能写成 if (o instanceof List< String >)
    注意,if (o instanceof List<?>)虽然合法,但是和if( o instanceof List) 是一样的
  2. class语法
    List.class是合法的
    但是List< string >.class是非法的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值