WangYanjie 最近的时间轴更新
WangYanjie

WangYanjie

V2EX 第 154585 号会员,加入于 2016-01-08 01:10:16 +08:00
  •   查看本主题需要登录
    WangYanjie 最近回复了
    2019 年 1 月 16 日
    回复了 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 年 1 月 16 日
    回复了 beijiaxu 创建的主题 Java jdk8 lambda 表达式推断问题
    @beijiaxu 看错题了,尴尬

    我理解的,明天去学习下能不能看到编译后的代码的
    1 泛型在编译期间会有 type erasure 的过程,会导致 Collection<String> 等价于 Collection<Object>,
    2 在 type erasure 的过程中,编译器会按需要自动加上
    2019 年 1 月 15 日
    回复了 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
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 06:12 · PVG 14:12 · LAX 22:12 · JFK 01:12
    ♥ Do have faith in what you're doing.