我试图从objects
user1
toString()
user2
从super
开始Object
但是当我使用user1
时,它指的是super.objects.get(0)
{1}}代替user1
。我想我可能不得不使用反射,但我不确定。如果user2
在其子女public abstract class Foo {
public List<Object> objects = new ArrayList<>();
public void add(String string) {
objects.add(string);
}
@Override
public String toString() {
//This line is broken:
Object object = super.objects.get(0);
}
}
中,我如何获得public class User extends Foo {}
?
public static void main(String args[]) {
User user1 = new User();
User user2 = new User();
user1.add(user2);
user2.toString();
}
&GT;
{{1}}
&GT;
{{1}}
答案 0 :(得分:2)
如果您的objects
字段为public
(不良做法!),protected
或受包保护(无显式访问修饰符),您的子类将能够直接访问它(如果在最后一个案例的同一个包内)。
来自super
的{{1}}次调用将返回Foo
的实例,因为Object
未明确扩展任何类,因此它会扩展Foo
。
您只需将Object
覆盖实施为toString()
或return String.valueOf(objects)
- 在第二种情况下检查空/ String.valueOf(objects.get(myIndex))
。
该方法将在运行时动态解析,可以从null
实例调用,从而表示User
或索引的任何对象。
这是一个简单的自包含示例,打印出整个集合:
objects
这将打印出public class Main {
public static void main(String[] args) {
System.out.println(new Bar());
}
static class Foo {
// package-protected field. A Bar instance will have access here.
List<Object> objects;
@Override
public String toString() {
// printing representation of "objects" and avoiding NPE
return String.valueOf(objects);
}
}
static class Bar extends Foo {
// overriding default constructor and initializing/populating "objects"
Bar() {
objects = new ArrayList<Object>();
objects.add(1);
}
}
}
。
<强>侧面注意
此外,返回[1]
的方法实际上应该返回String
。
你的String
覆盖没有。
答案 1 :(得分:0)
该行正常工作,因为Foo
没有声明超类,因此隐式子类Object
如果您想使用objects
中存储的Foo
,只需访问Object object = objects.get(0);