Дженерик против Класса - PullRequest
0 голосов
/ 24 января 2012

Здравствуйте, я делаю некоторые тесты, используя отражение ... пока у меня есть это:

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 ]

2 голосов
/ 24 января 2012

Вы можете объявить свой класс с параметром типа все, что вы хотите;вам, однако, нужен экземпляр класса, который вы пытаетесь преобразовать (потому что он используется в методе unmarshal).Вся информация о типах из обобщений удаляется после компиляции класса, поэтому среда выполнения не может узнать, для какого класса создать новый экземпляр.

0 голосов
/ 24 января 2012

Нет, вы не можете сделать это, пока и не измените

@Override
public boolean canConvert(Class clazz) {
}

Вызов. Ваше изменение на

public class MyConveter<T> implements Converter;

будет идти рука об руку с изменением API.

И плюс в основном при использовании generice, подобного этому классу, вы просто говорите, что у вас нет определенного определенного объекта, который может быть разрешен, который может быть чем угодно (любым объектом или его подклассом)

Подробнее об этом читайте в FAQ по Java или Angelika Laker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...