Динамическое приведение: класс и строка для сравнения - PullRequest
1 голос
/ 28 июня 2010

Вместо того, чтобы пытаться выразить мою проблему словами, вот код, демонстрирующий то, что я хочу сделать:

Class cls = Double.class
String str = "31.4";
Comparable comparableObj null;

comparableObj = (Comparable) cls.cast(str);

Есть идеи? Я смотрел на отражение, но безуспешно.

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Мне действительно не нравится то, что вы пытаетесь сделать, но вот моя модификация вашего кода, чтобы он компилировался и выполнялся:

Class [] domains = { Integer.class, Double.class, String.class };
String [] stringValues = { "12", "31.4", "dog" };
Comparable [] comparableObjects = { null, null, null };

for (int i = 0; i < domains.length; i++) {
    Constructor con = domains[i].getConstructor(String.class);
    comparableObjects[i] = (Comparable) con.newInstance(stringValues[i]);
    System.out.println(comparableObjects[i]);
}

Печать:

12
31.4
dog

Хотя это может помочь, если вы объясните словами, чего вы пытаетесь достичь, тогда вы можете получить больше помощи, сделав это лучше.

1 голос
/ 28 июня 2010

Вы должны будете вызывать метод valueOf каждого из этих классов. Так что, возможно:

for (int i = 0; i < domains.length; i++) {
    try {
        comparableObjects[i] = (Comparable) domains[i]
               .getMethod("valueOf", String.class).invoke(null, stringValues[i]);
    } catch (NoSuchMethodException ex) {
        comparableObjects[i] = stringValues[i];
    }
}

Этот код использует метод valueOf по отражению. getMethod(..) принимает имя метода и тип (ы) аргумента, а invoke(..) принимает null в качестве первого аргумента, поскольку метод является статическим.

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

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

...