gpt4 book ai didi

Java 8 闭包和类型识别

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:09 26 4
gpt4 key购买 nike

我正在测试 Java 8 的新闭包功能;我想知道为什么这段代码

public class Test8 {
private class A { int a;}
private class B { int b;}
interface IFA { void ifa(A param); }
interface IFB { void ifb(B param); }
private void forceA(A expr) { }
private void z(IFA fun) { System.out.println( "A"); fun.ifa( new A() ); }
private void z(IFB fun) { System.out.println( "B"); fun.ifb( new B() ); }

public void run() {
z( x -> forceA(x) );
}
public static void main(String args[]) { new Test8().run(); }
}

给出错误:test8 中的方法 z(IFA) 和 Test8 中的方法 z(IFB) 匹配错误在 run 方法中调用 z

编译器是否无法检测到 forceA 调用强制 x 为 A 类型,因此要使用的正确 z 是 z(IFA fun)

(类似的函数在 C# 中使用委托(delegate)是合法的;有没有办法在 Java 8 中获得相同的结果?)

最佳答案

Java 8 仍在进行中。最新规范确实允许您的代码工作。编译器的实现应该很快就会跟上。

不过,这种重载并不是一种好的风格。我们有签名

    z( A->void )
z( B->void )

然后当javac看到

    z( arg->{ block } )

不清楚哪个 z() 适用。必须完成额外的工作(通过编译 block )来选择一个。

我们真的不关心javac有多难。真正的问题是,当人类看到该代码时,人类必须更深入地挖掘以理解引用了哪个 z()。可读性不强。

根据经验,避免重载具有相同数量的功能接口(interface)的方法。不同的arities很好,没有歧义,对于人类或javac来说都是没有问题的

    z( arg->{...} )

z( (arg1,arg2)->{...} )

另一种形式的重载也受到设计者(Dan Smith 等)的青睐 - 相同的元数,相同的参数类型,但不同的返回类型

    z( X->R1 )
z( X->R2 )

但我认为它也很困惑,我会避免它。

关于Java 8 闭包和类型识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com