鲜为人知的Java 8功能:广义目标类型推断

遍历Java 8功能列表广义目标类型推断使我震惊,因为它是一个特别有趣,鲜为人知的瑰宝。 看起来Java语言设计人员将减轻过去使用泛型(Java 5-7)时遇到的某些痛苦。 让我们看看他们的例子:

class List<E> {
  static <Z> List<Z> nil() {..}
  static <Z> List<Z> cons(Z head, List<Z> tail) {..}
  E head() {..}
}

给定以上示例,JEP 101功能声称能够编写以下代码会很好:

// This:
List.cons(42, List.nil());
String s = List.nil().head();

// ... instead of this:
List.cons(42, List.<Integer>nil());
String s = List.<String>nil().head();

我自己是一名流利的API设计人员 ,我很高兴看到这样的改进正在路线图上,尤其是后者。 这些变化有什么激动人心的? 让我更详细地评论一下:

// In addition to inferring generic types from
// assignments
List<String> 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) {
        List<String> ls = List.nil();
        List.cons(42, List.nil());
        String s = List.nil().head();
    }
}

我编译了这个,然后得到了:

C:\Users\Lukas\java8>javac InferenceTest.java
InferenceTest.java:5: error: incompatible types: 
    Object cannot be converted to String
        String s = List.nil().head();
                                  ^
1 error

因此,实现了基于方法参数类型的类型推断(并因此进行了编译),但没有实现链式方法调用的类型推断。 我在互联网上搜索了一个解释,发现此Stack Overflow问题链接到了lambda-dev邮件列表上的这个有趣的线程

看来Java类型系统已经变得相当复杂。 太复杂,无法实现这种疯狂的类型推断。 但是,仍然需要进行一些细微的改进,这在每天编写Java 8代码时将非常有价值。

也许在Java 9中,我们将像其他所有人一样获得valvar


翻译自: https://www.javacodegeeks.com/2013/11/a-lesser-known-java-8-feature-generalized-target-type-inference.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值