[英]Java Compiler accepts generic method reference, but not when passed as variable
我有一组棘手的类 generics。 我不能更改Container
和GenericContainer
,但我可以更改 rest。
.with(Configuration::initialise)
的 static 版本有效.with(f)
没有问题是 GenericContainer class 上的通用SELF
参数,但我无法弄清楚确切的原因。
示例代码已准备好复制/粘贴。
初始化器:
import java.util.function.BiConsumer;
public interface Initializer {
<C extends Container<?>, S> C initialize(
C container,
BiConsumer<C, S> initializer
);
static <C extends Configuration.Container<?>> Initializer.Builder<C> init(
C container
) {
return new Initializer.Builder<>(container);
}
class Builder<C extends Configuration.Container<?>> {
private final C container;
public Builder(C container) {
this.container = container;
}
public <S> C with(BiConsumer<C, S> initializer) {
Initializer initService = null;
return container;
}
}
}
配置:
import java.util.function.BiConsumer;
import javax.sql.DataSource;
public class Configuration {
interface Container<SELF extends Container<SELF>> {}
static class GenericContainer<SELF extends GenericContainer<SELF>>
implements Container<SELF> {}
// works
public static void initialise(GenericContainer<?> container, DataSource ds) {}
public static final GenericContainer<?> CONTAINER_1 = Initializer
.init(new GenericContainer<>())
.with(Configuration::initialise);
// doesn't work
static BiConsumer<GenericContainer<?>, DataSource> f = (con, ds) -> {};
public static final GenericContainer<?> CONTAINER_2 = new Initializer.Builder<>(
new GenericContainer<>()
)
.with(f);
}
您不能这样做,因为您需要定义 GenericContainer 的类型参数,但是 java 标准中没有定义语法来为 lambda 提供泛型类型参数。 至于为什么它在方法参考中起作用我不确定,但它可能是类型推断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.