为什么擦除会使实现函数类型变得复杂?

Aiv*_*var 11 java generics language-design type-erasure

我在接受Neal Gafter采访时读到:

"例如,使用Erasure作为泛型的一部分,将函数类型添加到编程语言中要困难得多."

编辑:另一个我遇到类似声明的地方是Brian Goetz 在Lambda Dev邮件列表中消息,他说当lambdas只是具有语法糖的匿名类时更容易处理:

但我对函数类型的反对并不是我不喜欢函数类型 - 我喜欢函数类型 - 但是函数类型与Java类型系统的现有方面,擦除有很大关系.删除的功能类型是两个世界中最糟糕的.所以我们从设计中删除了它.

谁能解释这些陈述?为什么我需要lambdas的运行时类型信息?

Mar*_*anP 6

我理解它的方式是,他们认为,由于擦除,使用' 函数类型 ' 的方式会很麻烦,例如C#中的委托,它们只能使用lambda表达式,这只是单个抽象方法类的简化句法.

C#中的代表:

public delegate void DoSomethingDelegate(Object param1, Object param2);
...
//now assign some method to the function type variable (delegate)
DoSomethingDelegate f = DoSomething;
f(new Object(), new Object());
Run Code Online (Sandbox Code Playgroud)

(另一个示例 http://geekswithblogs.net/joycsharp/archive/2008/02/15/simple-c-delegate-sample.aspx)

他们在Project Lambda文档中提出的一个论点:

擦除通用类型,这将暴露开发人员暴露于擦除的其他位置.例如,不可能重载方法m(T-> U)和m(X-> Y),这会令人困惑.

第2节:http: //cr.openjdk.java.net/~briangoetz/lambda/lambda-state-3.html

(最终的lambda表达式语法与上述文档略有不同:http: //mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html)

(x, y) => { System.out.printf("%d + %d = %d%n", x, y, x+y); }
Run Code Online (Sandbox Code Playgroud)

总而言之,我最好的理解是,只有部分语法内容可以实际使用.Neal Gafter最有可能的意思是,无法使用委托将使标准API更难以适应功能样式,而不是javac/JVM更新将更难以完成.

如果有人比我更了解这一点,我会很乐意阅读他的账户.