![](/img/trans.png)
[英]Return generic class which extends Enum and implements and Interface-Java
[英]Java enum implements interface with Class<T> return type
好,很好
这是一个用返回“原始类型”的方法实现接口的枚举,该方法在接口中的getCaste()
方法上给我警告。
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<String>
转换为Class<T>
。 如果然后将返回值更改为(Class<T>) String.class
,则会收到未经检查的强制转换警告。
有没有办法做到这一点而没有警告?
编辑:
抱歉,我没有在前面添加它,但是这样做会很好:
, Type2 {
@Override
public Class getCaste() {
return Integer.class;
}
};
正如我刚才问到的由Radiodef链接的问题所确定的那样 ,您不能使用enum
来做到这一点,只能通过实际上是一个类的模拟枚举来做到这一点。
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
。 仅使用enum
是不可能的,因为枚举不能具有类型参数。
ps:如果您觉得这有帮助,请查看Radiodef的答案以获得更完整的解释,毕竟我是从他那里学到的:)
您可以不指定返回的类的type参数:
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();
}
假设您要定义几个不同的“类型化”枚举常量,则可以这样做:
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;
}
}
然后,将输入推迟到getCaste的将来使用中。 枚举的主要特征是封闭值域。 必须列出类中所有可能的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.