我有三个班级:
class A
{
public Object Person;
}
class B extends A
{
}
class C
{
public String Name;
}
我想访问姓名:
B b = new B();
C c = new C();
c.Name = "John";
b.Person = c;
String s = b.Person.Name; // This is not allowed. Name is not a property of Person.
如何引用Name属性(用于写入或读取)?
事实上,我可以有一个D,E,F类,我需要分配b.Person,其中每个类具有完全不同的属性。所以解决方案需要使用D,E,F等等。
答案 0 :(得分:3)
你需要施放:
String s = ((C)b.Person).Name;
请注意,这是一种危险的编码方法,因为现在对A中Person
的数据类型的更改可能会导致此代码在运行时抛出异常。你的模型强烈打字(即使用特定的类而不是Object
)会好得多。
答案 1 :(得分:2)
您需要设计更好的对象模型。 正如已经指出的那样,使用类型'Object'太抽象了。在某些时候,您的代码必须处理“具体”类型。 Java是一种强类型编程语言。其他一些语言更流畅,允许这种动态运行时输入。
答案 2 :(得分:0)
如果您想访问C
的成员(因为C
类型为Person
),您应该将此人转为Object
:
String s = ((C)b.Person).Name;
两个注释:
答案 3 :(得分:0)
您可以转换b来访问Name属性;
String s = ((C)b.Person).Name
答案 4 :(得分:0)
如果您的课程为beans,则可以使用Commons BeanUtils来阅读嵌套属性:
BeanUtils.getNestedProperty(b, "person.name");
PS:请尝试使用Java编码约定:成员名称以小写字母开头,属性通常是私有的,并且由get / set方法和so on公开。
答案 5 :(得分:0)
您可以考虑使用一些Generics:
class A<T>
{
public T person;
}
class B extends A<Person>
{
}
或/并使用一些接口。
无论如何它是一个奇怪的结构,你最好只使用一个Person类来设置名称。并且以面向对象的方式使用一些polymorphism。
我看到你开始使用大写字母的变量名称,所以一个小提示:使用camel-casing(我在我的例子中修复了它)