当前位置: 首页 > 知识库问答 >
问题:

Java enum使用类返回类型实现接口

韩梓
2023-03-14

好吧,乖点。

这里有一个枚举,它实现了一个接口,该接口返回一个“原始类型”,它给我一个关于接口中的getCaster()方法的警告。

public enum Thing implements HasCaste {

    Type1 {
        @Override
        public Class getCaste() {
            return String.class;
        }
    };
}

interface HasCaste {
    public Class getCaste();
}

如果我将接口的方法更改为:

public <T> Class<T> getCaste();

它会在Type1的方法签名上变为未经检查的警告。如果我改变Type1。getCaste()的签名:

public <T> Class<T> getCaste()

然后返回有一个不兼容的类型错误,因为Class

有没有办法在没有警告的情况下做到这一点?

编辑:

抱歉,我没有早些时候添加这个,但这样做会很好:

  , Type2 {
        @Override
        public Class getCaste() {
            return Integer.class;
        }
    };

共有3个答案

高化
2023-03-14

假设您想要定义几个不同的“类型”枚举常量,那么可以这样做:

interface HasCaste {
    public Class<?> getCaste();
}

public enum Thing implements HasCaste<?> {

    Type1(String.class),
    Type2(Integer.class);

    public final Class<?> clazz;

    private Thing(Class<?> clazz) {
        this.clazz = clazz;
    }

    @Override
    public Class<?> getCaste() {
        return clazz;
    }
}

一个枚举的主要特征是一个封闭的值域,它必须列出类中所有可能的值。

丁鸿云
2023-03-14

正如我刚才问的问题中所确定的那样,它是由Radiodef链接的,你不能用枚举来做这件事,只能用一个实际上是类的模拟枚举来做,就像这样。

public abstract class Thing<T> implements HasCaste<T> {
    public static final Thing<String> Type1 = new Thing<String>() {
        @Override
        public Class<String> getCaste() {
            return String.class;
        }
    };
    public static final Thing<Integer> Type2 = new Thing<Integer>() {
        @Override
        public Class<Integer> getCaste() {
            return Integer.class;
        }
    };

    private Thing() {
    }
}

正如您所看到的,这并不是一个enum。仅仅使用枚举是不可能的,因为枚举不能有类型参数。

p、 s:如果你觉得这很有帮助,请看Radiodef的答案以获得更完整的解释,毕竟我是从他那里学到的:)

谢夜洛
2023-03-14

可以不指定返回类的类型参数:

public enum Thing implements HasCaste {

    Type1 {
        @Override
        public Class<String> getCaste() {
            return String.class;
        }
    }, Type2 {
        @Override
        public Class<Integer> getCaste() {
            return Integer.class;
        }
    };
}

interface HasCaste {
    public Class<?> getCaste();
}
 类似资料:
  • 问题内容: 如何在实现类中强制执行方法getFoo(),返回相同实现类类型的列表。 现在,实现Bar的类将返回实现Bar的任何类的对象。我想使其更加严格,以便实现Bar的类在getFoo()中仅返回其类型的对象列表。 问题答案: 不幸的是,这不能由Java的类型系统强制执行。 但是,您可以通过使用以下方法来达到非常接近的效果: 然后您的实现类可以像这样实现它: 但是没有什么可以阻止另一个类这样做:

  • 问题内容: 如下代码: 产生以下错误: 错误CS0738:“ InheritanceTest.MyData”未实现接口成员“ InheritanceTest.ISomeData.Data”。’InheritanceTest.MyData.Data’无法实现’InheritanceTest.ISomeData.Data’,因为它没有匹配的返回类型’System.Collections.Generic

  • 我正在尝试一个非常基本(人为)的条件类型函数,但遇到了意外错误: 我认为这是一个非常简单的条件类型用法,所以不确定发生了什么。有什么想法吗?

  • 我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。 我的假设是做一个像这样的抽象函数: RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆

  • 我定义了这个类: 在其他地方,在具有此签名的函数中: 我尝试返回新的ActorMapper(),但javac抱怨: 我可以投射它,它工作得很好,但为什么不能编译呢。有人能帮我吗?:)

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