Java: как я могу сделать динамическое приведение переменной от одного типа к другому? - PullRequest
70 голосов
/ 24 января 2010

Я хотел бы выполнить динамическое приведение для переменной Java, тип преобразования хранится в другой переменной.

это обычный кастинг:

 String a = (String) 5;

вот что я хочу:

 String theType = 'String';
 String a = (theType) 5;

это возможно? и если да, то как? спасибо!

обновление

Я пытаюсь заполнить класс полученной хэш-картой.

это конструктор:

public ConnectParams(HashMap<String,Object> obj) {

    for (Map.Entry<String, Object> entry : obj.entrySet()) {
        try {
            Field f =  this.getClass().getField(entry.getKey());                
            f.set(this, entry.getValue()); /* <= CASTING PROBLEM */
        } catch (NoSuchFieldException ex) {
            log.error("did not find field '" + entry.getKey() + '"');
        } catch (IllegalAccessException ex) {
            log.error(ex.getMessage());         
        }
    }

}

проблема здесь в том, что некоторые переменные классов имеют тип Double, и если получено число 3, оно видит его как Integer, и у меня возникает проблема типа

Ответы [ 13 ]

0 голосов
/ 27 апреля 2017

Попробуйте это для Динамического Кастинга. Это будет работать!!!

    String something = "1234";
    String theType = "java.lang.Integer";
    Class<?> theClass = Class.forName(theType);
    Constructor<?> cons = theClass.getConstructor(String.class);
    Object ob =  cons.newInstance(something);
    System.out.println(ob.equals(1234));
0 голосов
/ 07 мая 2015

Просто подумал, что я опубликую то, что мне показалось весьма полезным и могло бы быть возможным для тех, кто испытывает аналогичные потребности.

Следующий метод был методом, который я написал для своего приложения JavaFX, чтобы избежать необходимости приведения и также писать, если объект x экземпляр операторов объекта b каждый раз возвращал контроллер.

public <U> Optional<U> getController(Class<U> castKlazz){
    try {
        return Optional.of(fxmlLoader.<U>getController());
    }catch (Exception e){
        e.printStackTrace();
    }
    return Optional.empty();
}

Объявление метода для получения контроллера было

public <T> T getController()

Используя тип U, переданный в мой метод через объект класса, он может быть перенаправлен в метод get контроллера, чтобы сообщить ему, какой тип объекта возвращать. Необязательный объект возвращается в случае, если указан неправильный класс, и возникает исключение, и в этом случае возвращается пустой необязательный объект, который мы можем проверить.

Вот как выглядел последний вызов метода (если для присутствия возвращаемого необязательного объекта требуется Consumer

getController(LoadController.class).ifPresent(controller->controller.onNotifyComplete());
0 голосов
/ 17 августа 2013

Недавно я почувствовал, что мне тоже нужно это сделать, но потом нашел другой способ, который, возможно, делает мой код более аккуратным и использует более качественную ООП.

У меня есть много родственных классов, каждый из которых реализует определенный метод doSomething(). Чтобы получить доступ к этому методу, мне сначала нужно будет создать экземпляр этого класса, но я создал суперкласс для всех моих родственных классов, и теперь я могу получить доступ к методу из суперкласса.

Ниже я покажу два способа альтернативных способов "динамического приведения".

// Method 1.
mFragment = getFragmentManager().findFragmentByTag(MyHelper.getName(mUnitNum));
switch (mUnitNum) {
case 0:
    ((MyFragment0) mFragment).sortNames(sortOptionNum);
    break;
case 1:
    ((MyFragment1) mFragment).sortNames(sortOptionNum);
    break;
case 2:
    ((MyFragment2) mFragment).sortNames(sortOptionNum);
    break;
}

и мой используемый в настоящее время метод

// Method 2.
mSuperFragment = (MySuperFragment) getFragmentManager().findFragmentByTag(MyHelper.getName(mUnitNum));
mSuperFragment.sortNames(sortOptionNum);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...