0

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

我想制作一个更优雅的函数,它可以采用 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
}

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

4

1 回答 1

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

这里的关键是绑定到Numberand 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;
}
于 2013-06-12T02:09:26.487 回答