приведение в объект на основе входящей строки - PullRequest
3 голосов
/ 17 августа 2011

Можно ли это сделать на Java

public <T> T[] getAttr(String s) {
    Object x = getSomething(s);
    com.class."s"[] y = (com.class."s"[]) x;
    return y;
}

Я понимаю, что все это очень грубо. Но основной принцип может быть достигнут в Java.

EDIT:

Ребята, у меня уже есть объект, который я хочу вернуть x. Я просто хочу, чтобы он возвращался как правильный тип. Т.е. классная версия s

Ответы [ 4 ]

2 голосов
/ 17 августа 2011

получить класс

Class<?> theClazz = Class.forName("com.class."+s);

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

java.lang.reflect.Array.newInstance(theClazz, length);

Вам придется подавить некоторые предупреждения о безопасности типов.Обойти это невозможно, если вы действительно хотите выйти из Струн.Возможно, вместо этого передайте объект Class, тогда его можно будет сделать типобезопасным.

1 голос
/ 17 августа 2011

Это было бы совершенно законно

public class Test {
    public static void main (String[] args) {

        Object o = new String("abc123");

        try {
            String s = cast(o, "java.lang.String");
            System.out.println(s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static <T> T cast(Object o, String clazz) throws ClassNotFoundException {
        return (T) Class.forName(clazz).cast(o);
    }
}

Вопрос в том, чего бы вы достигли? Не важно. Конечно, вы можете привести объект на основе строки (Class.cast (...)), но вам все равно нужно объявить ваш вывод как String во время компиляции. Разница между типом времени выполнения и типом времени компиляции. И ява строго типизирована. Компилятор не будет пытаться преобразовать вашу строку в тип, а дженерики строго во время компиляции.

1 голос
/ 17 августа 2011

Это очень небезопасный способ сделать это:

return (T[]) java.reflect.Array.newInstance( Class.forName( "com.class" + s, n );
0 голосов
/ 17 августа 2011

Я думаю, что это может быть достигнуто с помощью JAVA Reflection API , хотя я сталкивался с многочисленными предупреждениями об осторожности при его использовании, поскольку это может привести к трудно предвидимым последствиям.

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