gpt4 book ai didi

用于类似动态类型转换的 Java 反射/通用类型

转载 作者:行者123 更新时间:2023-12-01 23:45:55 25 4
gpt4 key购买 nike

我想知道这是否可能。我正在创建一个包含 Number 的类,该数字可以是 FloatInteger。但是,在运行时,这是决定的。

我想创建一个更优雅的函数,可以采用浮点或整数并对其进行数学运算,并且由于我确实将变量的类型存储在枚举中,所以我希望我可以使用泛型/来完成此任务反射(reflection)。

这是我的枚举

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

这是我类(class)的内部内容。

这是一些代码:

private <T extends Number> T compareTo(Class<T> lhs, Class<T> rhs) {
// lhs > rhs return 1
// rhs < lhs return -1
// else return 0
}

现在,正如我们所知,对于 Java,您无法像 type.clazz lhzType = (type.clazz) lhs 这样动态类型转换,但是有没有办法使用正确的泛型来完成此操作?我觉得应该有,因为如果出现任何反射问题,它可以作为错误抛出。但到目前为止,我对 Java 的了解还不是很深入。

最佳答案

我不明白你想要完成什么,但我可以告诉你如何实现你发布的代码片段:

首先,您的枚举应该将(有界)类传递给构造函数:

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

这里的关键是绑定(bind)到 NumberComparable<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;
}

关于用于类似动态类型转换的 Java 反射/通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com