通用与类<! - ? - >

时间:2012-01-24 09:40:28

标签: java generics reflection

您好我正在使用反射进行一些测试... 到目前为止,我有这个:

public class MyConveter implements Converter {
private Class<?> myClass;

public MyConveter(Class<?> myClass) {
    this.myClass = myClass;
}

@Override
public boolean canConvert(Class clazz) {
    return clazz.equals(myClass);
}

@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1, MarshallingContext arg2) {
    // TODO Auto-generated method stub
}

@Override
public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) {
    try {
        Object obj = myClass.newInstance();
        Field daoField = myClass.getDeclaredField("id");
        daoField.setAccessible(true);
        daoField.set(obj, Integer.valueOf(5));
        Field daoField2 = myClass.getDeclaredField("value");
        daoField2.setAccessible(true);
        daoField2.set(obj, "proj name");
        return obj;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    return null;
}

}

但是我不喜欢结果是否有办法将其改为:

public class MyConveter<T> implements Converter;

从而删除构造函数?

2 个答案:

答案 0 :(得分:2)

您可以使用所需的类型参数声明您的类;但是,你需要一个你想要转换的类的实例(因为它在unmarshal方法中使用)。编译类后,将删除泛型中的所有类型信息,因此运行时无法知道要为其创建新实例的类。

答案 1 :(得分:0)

除非你改变

,否则你不能这样做
@Override
public boolean canConvert(Class clazz) {
}

呼叫。您的更改

public class MyConveter<T> implements Converter;

将与api变化携手并进。

而且基本上在使用像​​这个类这样的generice时,你只是说你没有任何特定的对象被定义为允许的任何东西(任何Object或其子类)

阅读有效的java或Angelika Laker常见问题,了解更多详情。