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

标签 java generics

我有一组带有泛型的棘手类。我无法改变 ContainerGenericContainer ,但我可以改变其余的。

  • 带有 .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/

    相关文章:

    Javax.new.ssl.SSLHandShakeException 解决方案

    java - 当负载因子大于 1 时,如何填充 java 中的 hashMap?

    java - PECS 对于非集合中的泛型

    java - 这个特定的集合如何适合特定的场景?

    java - 如何在泛型类构造函数中为一个变体赋予特定类型?

    java - 科学图像处理 - 用于选择的最小边界区域(imageJ?)

    java - 跨并行继承层次结构访问方法

    java - JPA 避免在插入之前加载对象

    java - Mockito:如何模拟通用方法的 doAnswer

    c# - 是否可以将多个通用类型参数传递给一个方法?