@
WangYanjie 类型转换
3 Collection 是 raw type, 不参与 type erasure
一种猜想是 type ensure 的过程中加了 type cast,
一种猜想是 type ensure 的过程中加了 bridge method.
我倾向与后者
当使用 Collection 时,lambda 编译时对应的是 A
interface Consumer<T> {
accept(T o)
}
class A implements Consumer {
accept(Object o) {}
}
编译后
interface Consume {
accept(Object o)
}
class A implements Consumer {
accept(Object o) {}
}
当使用 Collection<String> 时,lambda 编译时对应的是 A
class Consumer<T> {
accept(Object o)
}
class A implements Consumer<String> {
accept(String o) {}
}
编译后会增加 i 一个 bridge method
class Consumer {
accept(Object o)
}
class A implements Consumer<String> {
accept(String o) {}
accept(Object o) {this.accept((String) o)}
}
主要的信息来源是 Java Generic FAQs:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ102从头阅读风味更佳