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);
}
}
注意:如果您内联一些变量,那么一些不工作的示例突然开始工作。
我的详细想法:
- 如果
IntConsumer i = A::consume
有效,则A::consume
必须实现 IntConsumer
- 如果
MyConsumer i2 = A::consume
有效,则A::consume
必须实现 MyConsumer
- 如果
A::consume
实现了两者、IntConsumer
和MyConsumer
,那么转换应该是可能的<
之后是否有另一种方法可以“转换”或“改变”消费者的类型?
最佳答案
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/