Java-Generic

Java-Generic

泛型类, 接口

  • 本质是引入一个或多个T

泛型方法

  • 本质是引入T或者wild cards
  • bounded/unbounded T
  • bounded/unbounded WC

  • 很显然, UWC, BWC的使用下, 仅能用于已有泛型类, 泛型接口的泛型参数, 不同独立的像T一样自由使用, 甚至是add(), put(), set()等创建/修改对象有关的操作无法进行. 容器元素句柄要用Object

关于泛型与继承, 能否引用的问题(类型声明的变量 + 创建的对象)

  • B[] = new D[]{} 正确, 带来了风险

    此处{ }可用于数组初始化, Java容器初始化, 其他情况initializer_list<T>类模板???

  • B = new D() 正确
  • GPB<E> = new GPD<E>()正确
  • GPB<E1> = new GPD<E2>()错误
    • 解决方式GPB<?> = new GPD<E2>()
    • 或者GPB<? extends E2> = new GPD<E2>() 看似很怪,但正确, 原因如下
  • GP<B> = new GP<D>() 错误
    • 解决方式 GP<?> = new GP<D>()
    • 或者 GP<? extends B> = new GP<D>()
    • 或者GP<? extends D> = new GP<D>()看似很怪,但正确, 原因如下

关于WC-UWC-BWC

  • 元素的WC <=> Object类型, 而GP应用之一是容器元素 => trival
  • 无法进行插入, 即add(), put(), set()
  • 可以remove(), get(), iterator<E>同理
  • 是声明, 是deduce, 是infer => 不能用于定义或new

关于泛型与非泛型

  • 非泛型 -> 泛型, 可能略去很复杂的过程, 也可能加TObject
  • 泛型->非泛型, 或(非泛型基类), 爽!

关于泛型数组

  • 定义泛型参数数组, 错误
  • 定义泛型参数为T(非bounded WC), 错误
  • 上述做变量/引用/参数声明, 正确
  • 原因是, 数组向基类数组cast后, 骚操作是可以实现插入, 再次向上cast后, 是默认T, 还是默认Object的问题

Other

  • 枚举, 异常, 不可泛型
  • 可继承泛型类, 实现泛型接口, 种种内部类可泛型, 内部接口可泛型
  • instanceof不可作用泛型

Supplement

  • 内部接口 类内部接口, 接口内部接口, Top Level, static block, 正确, 其余位置错误
  • 接口组织多个枚举