2012-01-24 2 views
0

Здравствуйте, я делаю некоторые тесты с помощью отражения ... до сих пор я получил это:Generic против класса <?>

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; 

таким образом удалив конструктор?

+0

В каком пакете находится класс конвертера, который вы пытаетесь реализовать? Это то, что вы написали или из библиотеки? – ARRG

+0

импорт com.thoughtworks.xstream.converters.Converter; – user952887

ответ

2

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

0

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

@Override 
public boolean canConvert(Class clazz) { 
} 

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

public class MyConveter<T> implements Converter; 

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

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

Читать Effective Java или Angelika LAKER FAQ для более подробной информации об этом.

+0

Трюк: если я передаю родовое, а не объект clas, получение типа класса не очень просто ... – user952887

Смежные вопросы