实现具有枚举值的接口作为通用参数

时间:2014-01-20 07:44:26

标签: java generics

我们假设我有一些枚举:

enum Resource { FILE, URL, STREAM }

假设我有一些Reader接口:

interface Reader<R extends Resource>

是否可以使用Enum Members创建不同的实现? 像那样:

class FileReader implements Reader<Resource.FILE>

我的观点用红色突出显示这个文字(这不是什么大惊喜)。

2 个答案:

答案 0 :(得分:2)

枚举成员是enum类型的实例,而不是子类。而且,枚举不能被子类化。因此,您无法编译代码。

我建议你这样写:

interface Reader {
    Resource getResource()
    ....
}

class FileReader implements Reader {
    @Override
    public Resource getResource() {return Resource.FILE;}
    ...
}

答案 1 :(得分:1)

正如亚历山大托卡列夫所说,你不能这样做。他的方法的另一种方法是通过从具有私有构造函数的基类扩展嵌套类来滚动自己的类枚举类:

public class Resource {
    private Resource() {}

    // some methods, abstract methods, etc...

    public static class File extends Resource {
      private File() {}

      // etc...
    }

    private static final File FILE = new File();

    // other subclasses of Resource
}

现在你可以像往常一样使用泛型:

interface Reader<R extends Resource> {...}
class FileReader implements Reader<Resource.File> {...}

这为您提供了枚举所具有的许多优点 - 类型安全性,一组封闭的值等 - 同时明确设置可与泛型一起使用的类层次结构。主要成本是代码简洁,但你也失去了使用switch语句中的值的能力,以及枚举的其他一些更深奥的好处。

相关问题