Java学习5(泛型初识及其相关)

来源:互联网 发布:支付宝无网络离线付款 编辑:程序博客网 时间:2024/06/03 21:53
泛型初识

注意

泛型有子类型化的规则,List是原生态类型List的一个子类型,List也是,但是List并不是List的子类型,即便看起来它们”相等”。举个栗子:
public class Test{
  public static void main(String[] args){
    List<String> strs = new ArrayList<String>();
    unsafeAdd(strs,new Integer(20));
    String s = strs.get(0);  //编译没问题,运行时会出错ClassCastException
  }
  public static void unsafeAdd(List<Object> list,Object o){
    list.add(o);
  }
}

解决这种问题,似乎只要将子类型改为原生类型就可以了,但是无疑很危险,这时候就用到了无限制的通配符类型

无限制通配符类型

如果不确定参数类型,那就使用?,例如List<?>这样也会有新的问题出现,由于不确定参数类型,你可以放一个Integer也可以放入String,这就违背了该集合的类型约束条件。怎么解决呢?

泛型方法/有限制的通配符类型

待学习。。。

问题思考:

//fail on runtimeObject[] o = new Long[1];o[0] = "hello";
//will not compileList<Object> list = new ArrayList<Long>();list.add...

附录:

术语 示例 参数化类型 List<String> 实际类型参数 String 泛型 List<E> 形式类型参数 E 无限制通配符类型 List<?> 有限制通配符类型 List<E extends Number> 原生类型 List 递归类型限制 <T extends Comparabel<T>> 泛型方法 static <E> List<E> asList(E[] a) 类型令牌 String .class

`

0 0