gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:37 28 4
gpt4 key购买 nike

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/

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