Java:动态地将Object引用引用到引用的类?

时间:2014-01-20 21:57:24

标签: java casting

是否可以使用不同的变量而不是使用类的名称来转换变量?

以下是正常运作的代码:

Object five = new Integer(5);
int six = (Integer) five + 1;

我很想用

替换第二行
int six = five + 1;

但我不能,所以我可以做其中一种替代方案:

int six = (foo) five + 1;
int six = foo(five) + 1;
int six = foo.cast(five) + 1;

...

为什么我要这样做
我有一个带有自定义枚举键的Map,以及String,Integer,Double等类型的值。

我想对地图条目值执行特定于类的操作,而不用对转换类进行硬编码。

例如

enum keyEnum { height, color; }

public static void main(String[] args) {
    Map<keyEnum, Object> map= new HashMap();
    String value1 = "red";
    Double value2 = 3.2;
    map.put(keyEnum.color, value1);
    map.put(keyEnum.height, value2);

    double x = (Double) map.get(keyEnum.height) + 10.5;
}

我真的想避免在最后一行硬编码(Double)。到目前为止找不到任何解决方案,只是表明它可能无法实现。

我正在将此设置用于需要编写和读写大型csv文件的程序。我希望Java能够自动地自动转换变量,这样我就不必记住或编写每个列类型的类。

我有一个所有列标题的枚举,我用它作为存储列变量的地图的键。这是为了避免对每列的数组索引进行硬编码(在row.split(“,”)之后),这是一个维护噩梦。我愿意接受更好的方法

2 个答案:

答案 0 :(得分:2)

你没有使用Java,因为它会变得缓慢,不安全和丑陋。你应该做的是

class MyType { double height; String color; }

public static void main(String[] args) {
    MyType mt = new MyType();
    mt.color = "red";
    mt.height = 3.2;

    double x = mt.height;

    // to iterate over the fields
    for(Field field: MyType.class.getDeclaredFields()) {
        System.out.println(field.getName() + "= "+ field.get(mt));
    }
}

使用编译时间检查会更加安全,使用更少的代码,并且它将使用更少的内存和CPU。

答案 1 :(得分:1)

将classtype存储在变量中,并利用强制转换方法。

Class<T> clscls.cast()