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;
}
}