Java枚举实现与类的接口<;T>;返回类型

Java枚举实现与类的接口<;T>;返回类型,java,generics,enums,Java,Generics,Enums,好的,乖一点 下面是一个枚举,它使用返回“原始类型”的方法实现接口,该方法在接口中的getCaste()方法上向我发出警告 public enum Thing implements HasCaste { Type1 { @Override public Class getCaste() { return String.class; } }; } interface HasCaste { publi

好的,乖一点

下面是一个枚举,它使用返回“原始类型”的方法实现接口,该方法在接口中的
getCaste()
方法上向我发出警告

public enum Thing implements HasCaste {

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

interface HasCaste {
    public Class getCaste();
}
如果我将接口的方法更改为:

public <T> Class<T> getCaste();
然后返回有不兼容的类型错误,因为
Class
无法转换为
Class
。如果我随后将返回值更改为
(Class)String.Class
,则会收到未选中的强制转换警告

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

编辑:

很抱歉,我之前没有添加此项,但最好这样做:

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

正如在中所确定的,您不能使用
枚举
,而只能使用实际为类的模拟枚举,如下所示

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() {
    }
}
公共抽象类实现hascate{
公共静态最终事物类型1=新事物(){
@凌驾
公共类getCaste(){
返回字符串.class;
}
};
公共静态最终事物类型2=新事物(){
@凌驾
公共类getCaste(){
返回Integer.class;
}
};
私事{
}
}
正如您所看到的,这不是一个
enum
。仅使用
枚举
是不可能的,因为枚举不能有类型参数


p、 s:如果您觉得这有帮助,请查看更完整的解释,毕竟我是从他那里学到的:)

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

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();
}
public enum东西实现hascate{
类型1{
@凌驾
公共类getCaste(){
返回字符串.class;
}
},第2类{
@凌驾
公共类getCaste(){
返回Integer.class;
}
};
}
界面等级{
公共类getCaste();
}

假设要定义几个不同类型的枚举常量,则可以执行以下操作:

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;
    }
}
接口HasCaste{
公共类getCaste();
}
公共枚举对象实现HasCaste{
类型1(字符串类),
类型2(整数类);
公开期末课;
私人物品(课堂){
this.clazz=clazz;
}
@凌驾
公共类getCaste(){
回击声;
}
}

然后将键入延迟到将来使用getCaste。枚举的主要特征是闭值域;必须列出类中所有可能的值。

相关:对于编辑,您不能使用enum。@Radiodef我实际上计划链接该问题:p(我是该问题的提问者)是的,很不幸,从技术上讲,枚举实际上可能携带泛型类型,所以这只是目前语言规范的一个限制。(@EpicPandaForce hi:)声明类型为
公共类getCaste()
的方法告诉编译器,该方法的调用方可以选择任何
T
并返回
类。但事实并非如此,因此您会收到一条警告。但协变覆盖不可见,因为常量声明只是
Thing
@Radiodef,如何测试覆盖不可见?请尝试像
Class c=Thing.Type1.getCaste()这样的赋值@Radiodef如果可以的话,这会违反Liskov吗?不会,因为它仍然作为超类型(返回一个
)。这里的问题是enum常量的声明是
Thing
,因此定义覆盖的匿名子类不可见。其他两个答案显然完成了任务。这个词不对吗?也许“不应该”会更好?如果你尝试访问
东西。在其他两个解决方案中键入1
,那么你将不会得到类作为
,键入2作为
类,你将得到它作为
本质上是
…哦,但是如果你只是想删除警告,那么当然,
会起作用。
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;
    }
}