首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enum<?扩展interface>

Enum<?扩展interface>
EN

Stack Overflow用户
提问于 2012-08-10 21:35:31
回答 2查看 5.8K关注 0票数 10

我试图拥有一个扩展公共接口的枚举集合,因此类似于:

代码语言:javascript
复制
interface Fooable
{
  void someCommonMethod();
}

enum E1 implements Fooable
{
   // some enumuerations and a definition for someCommonMethod()
}

enum E2 implements Fooable
{
   // some different enumerations and a different definition for someCommonMethod()
}

然后在其他地方利用这一点,同时强制变量是Enum ,而实现了接口。所以一些类似于..。

代码语言:javascript
复制
bar(Enum<? extends Fooable> fe)
{
  fe.ordinal();
  fe.someCommonMethod();
}

然而,到目前为止,我似乎不得不将fe转换为实现接口,即,

代码语言:javascript
复制
bar(Enum<? extends Fooable> fe)
{
  fe.ordinal();
  ((Fooable)fe).someCommonMethod();
}

虽然这应该是安全的。这似乎不太理想,而且我可能忽略了一些东西。当然,如果我试着把param作为一个傻瓜来传递,那么我最终会把它当作Enum来处理,这不仅是没有收益的,我现在甚至都不安全。见下文:

代码语言:javascript
复制
bar(Fooable fe)
{
  // potentially unsafe cast!
  ((Enum<?>)fe).ordinal();
  fe.someCommonMethod();
}

有什么是我忽略的还是

代码语言:javascript
复制
Enum<? extends Fooable>

就像我能得到的那样接近“好”解决方案?

我对Java还比较陌生,并且还在尝试像C或C++一样使用它,所以如果我把它当作一把锤子,而不是锯,或者忽略一些愚蠢的简单的东西,可以随意指出:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-10 22:20:28

一个选项是将您需要的任何方法从Enum添加到Fooable,或者创建一个扩展Fooable并添加所需Enum方法的新接口。

示例:

代码语言:javascript
复制
interface Fooable {
   void someCommonMethod();
}

interface FooableEnum extends Fooable {
   int ordinal();
}

enum E1 implements FooableEnum {
   // Implement someCommonMethod.
   // ordinal() is already implemented by default.
}

一旦您这样做了,您就可以在您的方法签名中使用FooableEnum作为参数类型,而不必担心任何泛型内容。

票数 1
EN

Stack Overflow用户

发布于 2012-08-10 21:55:44

这意味着T扩展Enum并实现Fooable:

代码语言:javascript
复制
<T extends Enum<T> & Fooable>

因此,您的方法可以编写为:

代码语言:javascript
复制
<T extends Enum<T> & Fooable> void bar(T fe) {
    fe.ordinal();
    fe.someCommonMethod();
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11909579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档