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

如果您确实希望参数为 type ,则需要将其转换Object为: 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

按照上面的 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

您正在尝试引用存在于 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 回答