做营销最好的网站源码,西安网络优化哪家好,网站怎样做优化网页,衡水做网站价格java 鲜为人知的知识点遍历Java 8的功能列表 #xff0c; 广义目标类型推断使我震惊#xff0c;因为它是一个特别有趣#xff0c;鲜为人知的瑰宝。 看起来Java语言设计人员将减轻过去使用泛型#xff08;Java 5-7#xff09;时遇到的某些痛苦。 让我们看看他们的例子… java 鲜为人知的知识点 遍历Java 8的功能列表 广义目标类型推断使我震惊因为它是一个特别有趣鲜为人知的瑰宝。 看起来Java语言设计人员将减轻过去使用泛型Java 5-7时遇到的某些痛苦。 让我们看看他们的例子 class ListE {static Z ListZ nil() {..}static Z ListZ cons(Z head, ListZ tail) {..}E head() {..}
} 给定以上示例JEP 101功能声称能够编写以下代码会很好 // This:
List.cons(42, List.nil());
String s List.nil().head();// ... instead of this:
List.cons(42, List.Integernil());
String s List.Stringnil().head(); 我自己是一名熟练的API设计师 我很高兴看到这样的改进正在发展中尤其是后者。 这些变化有什么激动人心的 让我更详细地评论一下 // In addition to inferring generic types from
// assignments
ListString l List.nil();// ... it would be nice for the compiler to be able
// to infer types from method argument types
List.cons(42, List.nil());// ... or from subsequent method calls
String s List.nil().head(); 因此在方法被链接的最后一个示例中类型推断将被延迟直到整个赋值表达式已被求值。 从分配的左侧编译器可以推断Z绑定到head()调用上的String 。 然后可以再次使用此信息来推断Z在nil()调用中再次绑定到String 。 对我来说这听起来像是很麻烦的事情因为需要延迟nil()调用的AST评估直到评估“依赖”子AST为止。 这是一个好主意吗 是的这太棒了 ……你可能会想。 因为可以以更加流畅的样式来设计流畅的API例如jOOQ或Streams API所以将类型推断推迟到调用链的末尾。 因此我下载了JDK 8的最新评估版以使用以下程序对此进行测试 public class InferenceTest {public static void main(String[] args) {ListString ls List.nil();List.cons(42, List.nil());String s List.nil().head();}
} 我编译了这个然后得到了 C:\Users\Lukas\java8javac InferenceTest.java
InferenceTest.java:5: error: incompatible types: Object cannot be converted to StringString s List.nil().head();^
1 error 因此实现了基于方法参数类型的类型推断并因此进行了编译但没有实现链式方法调用的类型推断。 我在互联网上搜索了一个解释发现此Stack Overflow问题链接到lambda-dev邮件列表上的此有趣线程 。 看来Java类型系统已经变得相当复杂。 太复杂无法实现这种疯狂的类型推断。 但是仍然需要进行一些细微的改进这在每天编写Java 8代码时将非常有价值。 也许在Java 9中我们将像其他所有人一样获得val和var 参考 鲜为人知的Java 8功能来自我们的JCG合作伙伴 Lukas Eder在JAVASQL和JOOQ博客上的广义目标类型推断 。 翻译自: https://www.javacodegeeks.com/2013/11/a-lesser-known-java-8-feature-generalized-target-type-inference.htmljava 鲜为人知的知识点