java泛型 泛型数组相关概念理解

参数化的类型:list<String>

实际类型参数:String

泛型:List<E>

形式类型参数: E

无限制通配符类型: List<?>

原生态类型: List

有限制类型参数: <E extends Number>

递归类型限制: <T extends Comparable<T>>

有限制通配符类型: List<? extends Number>

泛型方法: static <E> List<E> asList(E[] a)

类型令牌: String.class

数组跟泛型有两点不同:

一、数组是协变的:如果Sub为Super的子类型,那么Sub[]就是Super的子类型,而List<Sub>不是List<Super> 的子类型;

二、数组是具体化的:数组在运行时才知道并检查元素类型约束,如果类型不一致就会出现ArrayStoreException异常。而泛型在编译期就知道类型是否满足约束;

也正是由于这些原因,数组和泛型不能很好的混合使用。所有创建泛型、参数化类型或者类型参数的数组都是非法的。如:new List<E>[] , new List<String>[] , new E[]。都是不允许的。

参数化的类型:
List<Object> list1 = List<Object>();//correct:能放入所有类型
List<Object> list2 = List<Dog>();//error:想定义可以放入所有类型,又想限定只能放Dog类型,逻辑错误
Object[] objs = new Dog[10];//correct:只能放入Dog类型的数组
List<Object>[] obl = new List<Object> [10];//error:泛型数组不能new创建
List<Object>[] obl= new List[10];//correct:
泛型:E和泛型方法
class Cat<E> {
  private E e;
  //error:提示静态方法不能引用非静态E
  public static Cat<E> getInstance(){
    return new Cat<E>();
  }
  //correct
  public static <E> Cat<E> getInstance(){
    return new Cat<E>();
  }
  public E getEInstance() {
    return this.e;
  }
}


无限制通配符<?>
/**error:不能这么创建集合,必须制定集合类型参数**/
Set<?> set = new HashSet<?>();
/**可以这么创建集合,但是该集合只能接受null**/
Set<?> set = new HashSet<Object>();
Class<?> clazz = WildCard.class;//correct
Cat<?> c = new Cat();//warning
//correct
public void get(Set<?> set1,Set<?> set2) {
    for(Object os : set1) {
	set2.contains(os);
    }
}


有限制类型参数<E extends Number>和有限制通配符类型<? extends Number>
//error:这种形式的类型参数只能用在定义类或者方法里
List<E extends Pet> ccc = new ArrayList<Dog> ();
//correct:和通配符<?>一样,只能放入null;
List<? extends Pet> cct = new ArrayList<Dog>();
//correct:能取出正确的类型
Dog[] dogs = new Dog[2];
dogs[0] = new Dog();
dogs[1] = new Dog();
List<? extends Pet> cct = Arrays.asList(dogs);
//如Cat<E>类,也可以这样使用
Cat<? extends Pet> cc = new Cat<Dog>();

参考:Effective Java







转载于:https://my.oschina.net/u/782865/blog/203933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值