java - 如何更改函数引用的类型?

标签 java functional-programming

Java8 允许我使用方法声明作为我的任何接口(interface)的实现,只要它只包含一个方法即可。

但是一旦定义,类型就不能改变。

我的代码:

import java.util.function.IntConsumer;

public class A {

    interface MyConsumer {
        void doSomething(int i);
    }

    public static void main(String[] args) {
        IntConsumer i = A::consume;
        MyConsumer i2 = A::consume;

        IntConsumer i3 = (IntConsumer) i2; // ClassCastException
        MyConsumer i4 = (MyConsumer) i; // ClassCastException

        IntConsumer i5 = i2; // does not compile
        MyConsumer i6 = i; // does not compile

        IntConsumer i7 = i2::doSomething; // workaround, as suggested by @Eran http://stackoverflow.com/a/35846001/476791
        MyConsumer i8 = i::accept;

        Object i9 = A::consume; // does not compile
        Object i10 = (IntConsumer) A::consume; // works
        Object i11 = (MyConsumer) A::consume; // works
        Object i12 = (MyConsumer) (IntConsumer) A::consume; // does not work
    }

    static void consume(int i) {
        System.out.println(i);
    }
}

注意:如果您内联一些变量,那么一些不工作的示例突然开始工作。

我的详细想法:

  1. 如果 IntConsumer i = A::consume 有效,则 A::consume 必须实现 IntConsumer
  2. 如果 MyConsumer i2 = A::consume 有效,则 A::consume 必须实现 MyConsumer
  3. 如果 A::consume 实现了两者IntConsumerMyConsumer,那么转换应该是可能的<

之后是否有另一种方法可以“转换”或“改变”消费者的类型?

最佳答案

Is there another way to "cast" or "change" the type of the consumer afterwards?

您无法更改对象的实际类型(1)。您可以转换原语,也可以将引用转换为适合所引用对象的另一种类型。

您可以做的是用您想要的类型包装实例。

MyConsumer mc = ((IntConsumer) A::consume)::accept;

(1) 您可以破解对象 header 中的类指针,但这不太可能是个好主意。

关于java - 如何更改函数引用的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866449/

相关文章:

Java 字符串数字比较器

javascript - 如何使用 ramda 柯里化(Currying)多个参数而不专门调用返回函数

python - 列表理解和 for 循环中的 Lambda

list - 找到最嵌套的列表

python - 在 Python 中,为什么不能用 lambda 编写累加器生成器?

java - Maven - 一个包的多个模块

java - 在Java中,所有这些方法都被认为是纯函数吗?

Java - 将通用类的实例转换为专用类的实例

java - 如何将 BufferedImage RGBA 转换为 BufferedImage RGB?

r - 从均值为 5、标准差为 3 的正态分布中模拟 5000 个大小为 5 的样本