2013-06-12 58 views
0

我想知道这是否可能。我创建了一个包含Number的类,该编号可以是FloatInteger.但是,在运行时,这是决定的。动态类型铸造的Java反射/泛型类型

我想做一个更优雅的函数,可以采用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那样先进。

+2

我不知道什么是你真正想要做的(你有什么想法为了比较类,我理解比较类的对象,但比较类型),但似乎你可以通过使用http://pastebin.com/By5Kb1KV – Pshemo

+2

改善一点你的枚举我很困惑 - 为什么'compareTo'采取'Class '而不是'T's? –

回答

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

这里的关键是约束双方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; 
} 
+0

好的,但还有一件事。如果我想创建一个新的数字,比如说一个基于枚举类型的Float,我该如何声明它? 我在最后一段提到了这个问题,但我也应该把它作为我的问题的一个要点。 –

+0

基本上,我认为你的枚举应该是*操作*,而不是*类型*。宣布这样的类型是非常不寻常的。也许你应该在你想如何使用你的枚举的问题中显示一些代码 - 即使代码不能编译 - 所以我们可以理解你的想法的意图。 – Bohemian

+0

请参阅编辑答案,以获取返回类型的一种可能实现。 'clazz'可能是你的enum中的clazz,而tan则通过它。 – Bohemian