当前位置: 首页 > 面试题库 >

如何要求通用参数是实现接口的枚举?

薛宇
2023-03-14
问题内容

我不是100%相信这是个好主意,但是今天我碰到了一些目前实现为的代码:

class MyWidget <T extends Enum<T> > {
  MyWidget(Map<T, Integer> valueMap) {
    mValueMap = valueMap;
  }

  Map<T, Integer> mValueMap;
}

这里MyWidget再提供方法,其使用mValueMap转换传入的Enum向/从Integer

我正在考虑做的是试图重构它,以便声明自己的枚举:

interface MyInterface {
  public Integer getValue();
}

enum MyEnum implements MyInterface {
  foo, bar;
  public Integer getValue() {
    return ordinal();
  }
}

然后,我便可以将其重写MyWidget为如下所示的模糊内容:

public class MyWidget<T extends Enum<T> extends MyInterface> {
  ...
}

然后可以getValue()从中的MyInterfaceon- Ttype对象调用该方法MyWidget。当然,问题在于“ <T extends Enum<T> extends MyInterface>”不是有效的语法。有什么办法可以做到这一点?

我不想只拥有MyWidget<T extends MyInterface>,因为T成为枚举也很重要。

提前致谢!


问题答案:

改用’ &‘:

public class MyWidget<T extends Enum<T> & MyInterface> {
    ...
}

该JLS称这是“交集型”,但我能找到在Javahtml" target="_blank">教程没有提到它。我只是说这确实符合您希望“
extends”会做的事情。

另外,我应该提及的是,交点类型中可以具有任意数量的类型。因此,如果您愿意,可以执行以下操作:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
    ...
}

[注意:此代码示例不应解释为对Cloneable接口的认可;当时只是方便。]



 类似资料:
  • 问题内容: 在Java中这样做是合法的: 我该怎么做(语法不合法): 我想尽可能地迫使调用者使用既可追加又可关闭的对象,而无需特定类型。 有多个标准类可以执行此操作,例如BufferedWriter,PrintStream等。 如果我定义自己的界面 因为实现了Appendable和Closeable的标准类没有实现我的接口AppendableAndCloseable,所以这是行不通的(除非我不像我

  • 但是,我的问题在于如何理解当我尝试使用而不是执行相同操作时会发生什么 这里的例子是,有一个接口定义被定义为接受一个接口参数,实际上,这个接口参数是由实现接口的枚举实现的: 我有两个接口: 我看到了一些关于,但这扩展了我的理解。请救命! 顺便说一句,我认为返回类之前的泛型声明被用来指定“T”以用于类型侵蚀的目的,这是正确的吗?

  • 问题内容: 我有这个界面: 并实现该类: 在此案例中,parameter是,这是的具体实现。如何使用反射获得此效果? 问题答案: 通过通用接口解析类型。例如 PS:请记住acutalTypeArguments是type 。他们一定不是一个。在您的情况下,它是一个Class,因为您的类型定义是。

  • 问题内容: 我有一个关于在接口中放置Java枚举的问题。为了使其更清楚,请参见以下代码: 我知道一个接口由带有 空主体 的方法组成。但是,我在这里使用的枚举需要一个构造函数和一个方法来获取关联的值。在此示例中,建议的接口将不仅包含空主体的方法。是否允许这种实现? 我不确定是否应该将枚举类放入接口或实现此接口的类中。 如果将枚举放入实现此接口的类中,则方法public Number getNumbe

  • 我有一个关于在接口中放置Java枚举的问题。为了更清楚,请看下面的代码: 我知道一个接口由带有空主体的方法组成。但是,我在这里使用的枚举需要一个构造函数和一个方法来获取关联的值。在本例中,所建议的接口将不仅仅由具有空主体的方法组成。允许这种实现吗?

  • 问题内容: 考虑以下代码: 由于类型擦除的限制,我收到以下错误消息: java.lang.Comparable的不能使用不同的参数继承:和 我有以下要求: 需要是一个枚举,因为我需要将其用作注释中的默认值。 我的界面的约定是,它必须具有可比性。 我已经尝试在接口中使用通用范围,但是Java不支持此功能。 问题答案: 枚举实现Comparable,因此FooImpl最终使用不兼容的参数将Compar