《Effective java》读书记录-第23条-请不要在新代码中使用原生态类型

声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型( generic)类或者接口。

泛型类和泛型接口统称为泛型( generic type)。

每种泛型都可以定义一组参数化的类型(parameterized type),构成格式:类(接口)名<参数类型>。

每种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。

如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。

出错之后应该尽快发现,最好是在编译时就发现。

1、使用泛型后,就可以很快的发现错误。

2、使用泛型后,删除元素就不需要进行手工转换了。如下代码:

public void test(){
        MyList<MyItem> myItemMyList=new MyList<MyItem>();
        myItemMyList.add(new MyItem1("123"));
        Set set=new Set();
    }
public class MyList<E> {

   private E e;

    public MyList () {
    }

    public void add(E e){
        this.e=e;
    }

    public E getMyList(){
        return e;
    }

}

public class MyItem1 {
    private String name;

    public MyItem1(String name) {
        this.name=name;
    }
}

public class MyItem {
    private String name;

    public MyItem (String name) {
       this.name=name;
    }
}

如果不提供参数类型,使用集合类型和其他泛型也仍然是合法的,但不应该这么做。如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势

原生态类型List和参数化类型List<Object>之间有什么区别?

前者逃避了泛型检查,后者则明确告知编译器,它能够持有任意类型的对象。

你可以将List<String>传递给类型List的参数 却不能传递给类型List<Object>的参数。因为,泛型有子类型化的规则,List<String>是原生态类型List的一个子类型,而不是参数化类型List<Object>的子类型(见第25条)。

如果使用像List这样的原生类型,就会失掉类型安全性,但是如果使用像List<Object>这样的参数化类型,则不会。

那如果遇到不确定元素类型的时候该怎么办?

这种情况是可以使用原生态类型,但是很危险。在Java1.5开始,提供了一个安全的替代方法,无限制的通配符(unbounded wildcard type)。如:Set<?>。

有两种情况可以使用原生态类型。

1、在类文字(class literal)中必须使用原生态类型。也就是说List.class,String[].class和int.class是合法的,但是List<String>.class和List<?>.class是非法的。

2、与instanceof操作符有关。由于泛型信息可以在运行时被擦除,因此在参数化类型而非无限制通配符类型上使用instanceof操作符是非法的。

下面是利用泛型来使用instanceof操作符的首选方法:

if(o instanceof Set){

Set<?> m=(Set<?>)o;

}

注意:一旦确定这个o是个Set,就必须将它转换成通配符类型Set<?>再用Set<?>做后续操作。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值