繁体   English   中英

Java 编译器接受泛型方法引用,但在作为变量传递时不接受

[英]Java Compiler accepts generic method reference, but not when passed as variable

我有一组棘手的类 generics。 我不能更改ContainerGenericContainer ,但我可以更改 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM