Приведение к неизвестному типу, когда имя класса в виде строки - PullRequest
0 голосов
/ 04 февраля 2009
public class ExampleClass {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Horse hr1 = new Horse();
        Horse hr2 = new Horse();
        Horse hr3 = new Horse();
        Horse hr4 = new Horse();
        Set hrSet = new HashSet();
        hrSet.add(hr1);
        hrSet.add(hr2);
        hrSet.add(hr3);
        hrSet.add(hr4);
        Horse hr;
        String hor = "sher_pkg.Horse";
        callHorse(hrSet,hor);
    }
    public static void callHorse(Set xSet,String clsName){
        try {
            Class hrt = Class.forName(clsName);

            Iterator hritr = xSet.iterator();
            while(hritr.hasNext()){
                exam(hrt.cast(hritr.next()));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static void exam(Object obj){ //I want to use exam(Horse hrr)
        System.out.println(obj);
    }
}

Здесь аргументом для функции экзамена является Object. Но я хочу, чтобы аргумент был Horse ... так что же нужно изменить в вызове метода "exam(hrt.cast(hritr.next()))"? Я не хочу явно использовать имя класса Horse в callHorse() ... Так что я должен делать?

Спасибо

Ответы [ 12 ]

0 голосов
/ 04 февраля 2009

Перво-наперво, в вашем наборе должны использоваться либо дженерики, либо явное определение только удержания объектов Horse.

(final Set xSet<Horse>, final String clsName){
...}

Исправьте это, и вы исправите 90% проблем.

0 голосов
/ 04 февраля 2009

Вы могли бы явно привести в вызове функции -

    try {
            Class hrt = Class.forName(clsName);

            Iterator hritr = xSet.iterator();
            while(hritr.hasNext()){
                    exam((Horse)hrt.cast(hritr.next()));
            }
    } 

но я не совсем уверен, чего вы здесь добиваетесь - если вы пишете код, который явно ссылается на Horses, зачем вам динамически определять тип класса из строки?

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