WangYanjie 最近的时间轴更新
WangYanjie

WangYanjie

V2EX 第 154585 号会员,加入于 2016-01-08 01:10:16 +08:00
WangYanjie 最近回复了
2019-01-16 22:28:04 +08:00
回复了 beijiaxu 创建的主题 Java jdk8 lambda 表达式推断问题
@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

从头阅读风味更佳
2019-01-16 21:55:09 +08:00
回复了 beijiaxu 创建的主题 Java jdk8 lambda 表达式推断问题
@beijiaxu 看错题了,尴尬

我理解的,明天去学习下能不能看到编译后的代码的
1 泛型在编译期间会有 type erasure 的过程,会导致 Collection<String> 等价于 Collection<Object>,
2 在 type erasure 的过程中,编译器会按需要自动加上
2019-01-15 23:33:09 +08:00
回复了 beijiaxu 创建的主题 Java jdk8 lambda 表达式推断问题
interface Collection<?>{} 是 generic type.

Collection<String> 是 parameterized type, an instance of generic type `Collection`
Collection 是 raw type, java 5 之前的产物
Collection<?> 是 unbound wildcard parameterized type
type erasure 的 **一部分** 是指编译器会在编译期间,把 parameterized type 中的 type parameter 都消去,
Collection<String>, Collection, Collection<?> 应该都是对应的一种运行时的类

尝试了以下并没有你这样的效果。

import java.util.*;

public class Demo {
public static List<String> methodA(Collection<String> cs) {
List<String> stringList = new ArrayList<>();
for (String s : cs) {
stringList.add(s);
}
return stringList;
}

public static void main(String args[]) {
Map<String, Object> map = new HashMap<>();
List<String> stringList = new ArrayList<>();
stringList.add("s");
map.put("A", stringList);
methodA((Collection) map.get("A")).stream().forEach(p -> System.out.println(p.getClass()));
methodA((Collection<String>) map.get("A")).stream().forEach(p -> System.out.println(p.getClass()));
}
}


class java.lang.String
class java.lang.String

➜ ~ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
java 是怎么处理泛型的?
我更好奇,过程中是如何保证重构代码的功能正确性的?
1 到底是不是 bug,最好再确认下
2 解不解决,看你自己的选择,谨记一点,如果要做事,务必让大家都看到你的成果,不要做了好事还不留名
@lolizeppelin 不赞同你的看法,我认为是:
If you want to simply access a global variable you just use its name. However to change its value you need to use the global keyword.
不要 retry_time -= 1
关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3873 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 06:52 · PVG 14:52 · LAX 23:52 · JFK 02:52
♥ Do have faith in what you're doing.