我想知道这是否可行。我正在创建一个包含Number
的类,该数字可以是Float
或Integer.
但是,在运行时,这是决定的。
我想创建一个更优雅的函数,可以使用Float或Integer并对其进行数学运算,因为我确实存储了变量的类型,我希望我可以使用泛型/反射。
这是我的枚举
public enum Type {
FLOAT,
INTEGER;
public final Class clazz;
Type() {
if (this.name().equals("FLOAT"))
clazz = Float.class;
else if (this.name().equals("INTEGER"))
clazz = Integer.class;
else
clazz = null;
}
}
这是我班上的内心。
以下是一些代码:
private <T extends Number> T compareTo(Class<T> lhs, Class<T> rhs) {
// lhs > rhs return 1
// rhs < lhs return -1
// else return 0
}
现在,正如我们所知道的那样,你不能像type.clazz lhzType = (type.clazz) lhs
那样动态地输入类型转换器,但有没有办法使用适当的泛型来完成这项工作?我觉得应该有,因为如果出现任何反射问题,它可能只是作为一个错误抛出。但到目前为止,我对Java并不是很先进。
答案 0 :(得分:3)
我不明白你想要完成什么,但我可以告诉你如何实现你发布的代码片段:
首先,你的枚举应该将(有界)类传递给构造函数:
public enum Type {
FLOAT(Float.class),
INTEGER(Integer.class);
private final Class<T extends Number & Comparable<T>> clazz;
Type(Class<T extends Number & Comparable<T>> clazz) {
this.clazz = clazz;
}
}
请注意,我不知道你要用该课程做什么。
其次,你的方法需要输入方法来声明传入的对象的类型,和你不需要引用你的类类型枚举,并且该方法与枚举实际上没有任何关系。它可以是放在任何地方的静态实用方法:
public static <T extends Number & Comparable<T>> int compareTo(T lhs, T rhs) {
return lhs.compareTo(rhs);
}
此处的关键是绑定到Number
和Comparable<T>
,因为虽然所有Number
子类都实现compareTo()
,但Number
类会执行不定义它。
要返回与参数相同的类型,您可以使用反射,如下所示:
// Coded for brevity rather than "best practice"
public static <T extends Number & Comparable<T>> T compareTo(Class<T> clazz, T lhs, T rhs) throws Exception {
String s = "some string that represents the value of the new Numner";
T t = clazz.getConstructor(String.class).newInstance(s);
return t;
}