0

型キャストされて一部のクラスのオブジェクトに参照される「オブジェクト」クラスのオブジェクトを参照できないのはなぜですか。次のコードで説明します。言葉にするのは難しいです。つまり、スーパー クラス オブジェクトのオブジェクトは、任意のタイプのクラスのオブジェクトを参照できる必要があります。

public class ChildClass {

public static void main(String[]args){
    Simple obj1=new Simple();
    Object obj2=(Simple)obj1;
    System.out.println("1-obj1.a is "+ obj1.a+" obj1.name is "+obj1.name);
    System.out.println("2-obj2.a is "+ obj2.a+" obj2.name is "+obj2.name);/*a cannot be resolved or is not a 
    field*/
    doSomething(obj2);
    System.out.println("3-obj2.a is "+ obj2.a+" obj2.name is "+obj2.name);/*a cannot be resolved or is not a 
    field*/
    System.out.println("4-obj1.a is "+ obj1.a+" obj1.name is "+obj1.name);
}

private static void doSomething(Object obj2) {
    obj2.a=99;//a cannot be resolved or is not a field
    obj2.name="new name";//name cannot be resolved or is not a field

}
class Simple {

    int a=9;
    String name="something";

}

}
4

3 に答える 3

1

上記の Keppil が提案することを実行します。

または、obj2 を Simple 型にキャストしているため、doSomething のパラメーターをその型に変更するだけです。

private static void doSomething( Simple simple ) { 
    simple.a=99;
    simple.name="new name";
}

あなたも変わるべき

Object obj2=(Simple)obj1;

Simple obj2 = (Simple)obj1;
于 2012-10-19T20:58:12.407 に答える
1

引数を の型にしたい場合は、 Objecttoをキャストする必要があります。 SimpleObject

private static void doSomething(Object obj2) {
    ((Simple)obj2).a = 99;
    ((Simple)obj2).name = "new name";
}

または、もう少し安全にするために:

private static void doSomething(Object obj2) {
    if (obj2 instanceof Simple) {
        Simple simple = (Simple) obj2;  
        simple.a = 99;
        simple.name = "new name";
    }
}

あなたはそれを後ろ向きに持っているようです。型の参照をSimple使用して のメソッドを呼び出すことはできますがObject、その逆はできません。

于 2012-10-19T20:54:01.657 に答える
1

Simple クラスのインスタンスに存在するフィールドを参照しようとしていますが、オブジェクトを Simple のインスタンスに型キャストしていません。

変数 obj2 は Simple のインスタンスを保持するために割り当てられていますが、Object 型として宣言されています。Simple 型に明示的にキャストされていない場合、コンパイラは obj2 が Object 型の関数を持っているとしか想定できません。

私はこのコードをテストしていませんが、要点は理解できるはずです。注意: Simple 型で宣言されたフィールドを参照するときはいつでも、obj2 を Simple 型にキャストしています。

public class ChildClass {

public static void main(String[]args){
    Simple obj1=new Simple();
    Object obj2=obj1;
    System.out.println("1-obj1.a is "+ obj1.a+" obj1.name is "+obj1.name);
    System.out.println("2-obj2.a is "+ ((Simple)obj2).a+" obj2.name is "+((Simple)obj2).name);
    doSomething((Simple)obj2);
    System.out.println("3-obj2.a is "+ ((Simple)obj2).a+" obj2.name is "+((Simple)obj2).name);
    System.out.println("4-obj1.a is "+ obj1.a+" obj1.name is "+obj1.name);
}

    private static void doSomething(Simple obj2) {
        obj2.a=99;//a cannot be resolved or is not a field
        obj2.name="new name";//name cannot be resolved or is not a field
    }
    class Simple {
        int a=9;
        String name="something";
    }
}
于 2012-10-19T21:01:51.580 に答える