0

この質問は紛らわしいように聞こえるかもしれませんが、正直なところそうです。私は最善を尽くして自分自身を説明しようとします。

Java Reflectionを使用して、特定のクラスから新しいオブジェクトを作成し、それを に追加するメソッドを作成していListます。私のクラスは次のとおりです。したがって、私のリストは次のとおりですList<Train>が、Reflectionによって作成されたオブジェクトから得られるのは、一般/通常のオブジェクトです。toStringつまり、hashCode、 などのメソッドのみを持ち、Train クラスのメソッドを持たないオブジェクトです。したがって、オブジェクトを Train 型のオブジェクトにキャストする必要があります。何かのようなもの:Train t = (Train) Object;

私が立ち往生しているのは、メソッドがパラメーターに含まれているため、クラスを認識していることですが、キャストする方法がわかりません...うーん、わかりにくいです。実際の例を示しましょう。

クラストレイン:

public class Train {
private String name;
private int id;
private String brand;
private String model; 


public Train(String name, int id, String brand, String model)
{
    this.name = name;
    this.id = id;
    this.brand = brand;
    this.model = model;
}

public void setName(String name) {
    this.name = name;
}

public void setId(int id) {
    this.id = id;
}
(... more sets and gets)
}

私の方法(ここでは、私が立ち往生しているコメントで説明します):

public class NewMain {

public static void main(String[] args) {
    try {

                List<Train> list = new ArrayList<>();
                qqCoisa(list, Train.class, String.class, int.class);


    } catch (ClassNotFoundException ex) {
        System.out.println("Erro ClassNotFound -> "+ex.getMessage());
    } catch (NoSuchMethodException ex) {
        System.out.println("Erro NoSuchMethod - > "+ ex.getMessage());
    } catch (InstantiationException ex) {
        System.out.println("InstantiationException -> "+ ex.getMessage());
    } catch (IllegalAccessException ex) {
        System.out.println("IllegalAcessException -> "+ ex.getMessage());
    } catch (IllegalArgumentException ex) {
        System.out.println("IllegalArgumentException -> "+ ex.getMessage());
    } catch (InvocationTargetException ex) {
        System.out.println("Invocation Target Exception -> "+ ex.getMessage());
    }
}



public static void qqCoisa(List list, Class theClass, Class _string, Class _int) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{

    Constructor ctor = theClass.getConstructor(_string, _int, _string, _string);
    ctor.setAccessible(true);
    Object obj = ctor.newInstance("Train XPTO", 1, "Volvo", "FH12");


    // here is where I'm stuck, In this case I know it is a Train object so 
    // I cast it 'manually' to Train but the way I want to do is to make it 
    // cast for the same type of theClass that comes in the parameter.
    // Something like: theClass t = (theClass) obj;
    Train t = (Train) obj; 
    list.add(t); 

    System.out.println("T toString -> "+t.toString());
    System.out.println("Obj toString -> "+obj.toString());
}

私が自分自身を説明していない場合は、お知らせください。さらに説明します。

4

1 に答える 1

1

次のように qqCoisa メソッドを宣言できます。

public static <T> void qqCoisa(List<T> list, Class<String> _string, Class<Integer> _int) throws Exception
{
    ....
    ....

    @SuppressWarnings("unchecked")
    T t = (T) obj;
    list.add(t);

    ....
    ....
}

これは、T 型のパラメーターで機能するジェネリック メソッドです。パラメーターの型を T として宣言すると、メソッド宣言がこの情報を運ぶため、Class 引数は冗長になります。

于 2013-10-12T04:23:06.963 に答える