Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义一个枚举,其中零个或多个使用者在公共接口的实现上操作?_Java_Generics_Enums - Fatal编程技术网

Java 如何定义一个枚举,其中零个或多个使用者在公共接口的实现上操作?

Java 如何定义一个枚举,其中零个或多个使用者在公共接口的实现上操作?,java,generics,enums,Java,Generics,Enums,我有以下类似的代码(尽可能简化),可编译: class Test { enum TestEnum { ELEMENT1(Test::methodUsingTestclass1); <T extends TestInterface> TestEnum(Consumer<T>... consumers) { } } static void methodUsingTestclass1(TestClass1 testClass1) {

我有以下类似的代码(尽可能简化),可编译:

class Test {

  enum TestEnum {
    ELEMENT1(Test::methodUsingTestclass1);

    <T extends TestInterface> TestEnum(Consumer<T>... consumers) {
    }
  }

  static void methodUsingTestclass1(TestClass1 testClass1) {
  }

  static void methodUsingTestclass2(TestClass2 testClass2) {
  }

  interface TestInterface {
  }

  class TestClass1 implements TestInterface {
  }

  class TestClass2 implements TestInterface {
  }

}
这不再编译:

class Test {

  enum TestEnum {
    ELEMENT1(Test::methodUsingTestclass1);

    <T extends TestInterface> TestEnum(Consumer<T>... consumers) {
    }
  }

  static void methodUsingTestclass1(TestClass1 testClass1) {
  }

  static void methodUsingTestclass2(TestClass2 testClass2) {
  }

  interface TestInterface {
  }

  class TestClass1 implements TestInterface {
  }

  class TestClass2 implements TestInterface {
  }

}
类型参数T的上限不兼容:Test.TestClass1和Test.TestClass2

T
实现了
TestInterface
,我想定义一个或多个在
T
上运行的
Consumer
s。换句话说,方法引用列表指向接受
TestInterface
实现类的方法

我试过这个:

enum TestEnum {
  ELEMENT1(Test::methodUsingTestclass1, Test::methodUsingTestclass2);

  <T extends TestInterface> TestEnum(Consumer<? extends T>... consumers) {
  }
}
enum TestEnum{
元素1(Test::methodUsingTestclass1,Test::methodUsingTestclass2);

睾丸(消费者问题是,
方法使用TestClass1
不是一种
消费者
。也就是说,它不能消费
TestClass2
,这是
消费者
应该能做的。@Sweeper所以,我想要的是
消费者
,它可以同时消费
TestClass1
TestClass2
。但我不知道如何用代码来表达。即使你可以这样做,无论在哪里使用参数
消费者
,也没有足够的上下文让你发送该消费者接受的正确参数。对你来说,第一个测试是:向我们展示你如何使用这些
消费者…消费者
在枚举中,您将看到问题。
Consumer
就是这种类型的使用者。但是请注意,
Test::methodUsingTestclass1
不是这种类型的实例,因为该方法只能使用
TestClass1
,而不能“同时使用
TestClass1
TestClass2
”你打算如何使用这个消费者数组?我怀疑这是一个在引入MVCE时失去上下文的例子。如果你真的在枚举中使用这些消费者,那么你可能使用了不同于
Consumer
的接口。因为
methodUsingTestclass1
methodUsingTes之间的差异tclass2
要在调用时有意义,函数接口类型必须对具体的
TestInterface
参数敏感。消费者没有这个概念。