gpt4 book ai didi

java - 为什么有时不能仅引用非静态方法?

转载 作者:行者123 更新时间:2023-11-30 07:44:05 26 4
gpt4 key购买 nike

我遇到了一个相当奇怪的编译器行为:非静态方法可以从静态上下文中引用,但并非总是如此。我的理解是

void method() {}

void static method(ThisClassName c) {}

在 JVM 中应该有相同的签名,因此它们的引用应该表现相同,但显然我错了。

这是我的例子:

家长:

package com.example;

abstract class Parent<S> {
abstract void doSomething(final S s);
}

child :

package com.example;

import java.util.function.BiConsumer;

class Child extends Parent<String> {
// This line compiles OK
private static BiConsumer<Child, String> consumer1 = Child::doSomething;
// Compiler error: "Non-static method cannot be referenced from a static context."
private static BiConsumer<Parent, String> consumer2 = Child::doSomething;
// This line compiles OK
private static BiConsumer<Parent, String> consumer3 = Child::doSomethingElse;

@Override
void doSomething(final String s) {
// do something
}

static void doSomethingElse(final Parent<String> c, final String s) {
// do something else
}

}

这里的问题是由于编译错误无法设置consumer2。

我是怎么发现的:我需要通过

Map<String, BiConsumer<Parent, ?>>

并且 map 本身仅构建一次(在启动时),因此将其设为静态最终是有意义的。

最佳答案

这看起来像是一个糟糕的编译器错误报告案例。使用我的编译器(Eclipse)我得到了错误:

The type Child does not define doSomething(Parent, String) that is applicable here

事实上它没有,因为实例方法有一个隐式的接收者参数(this),对于Child::doSomething类型为 Child , 所以 BiConsumer<Parent, String>不是兼容的目标类型。

您可以使用对 Parent 的引用doSomething 的版本相反:

private static BiConsumer<Parent, String> consumer2 = Parent::doSomething;

关于java - 为什么有时不能仅引用非静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833733/

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