我有一组带有泛型的棘手类。我无法改变 Container
和 GenericContainer
,但我可以改变其余的。
.with(Configuration::initialise)
的静态版本作品 .with(f)
没有 问题是通用的
SELF
GenericContainer 类上的参数,但我无法弄清楚确切原因。示例代码已准备好复制/粘贴。
初始化程序:
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 提供泛型类型参数。
至于为什么它在方法引用中起作用我不确定,但它可能是类型推断。
关于Java Compiler 接受泛型方法引用,但在作为变量传递时不接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62645471/