我有一个班级:
public class Example {
public String name;
}
但是这个类不必被调用示例可能不同(例如Example2,AnotherExample我不知道如何),问题是我不知道如何调用。
在另一个类中,我有一个方法,它将参数列表作为参数。 我的示例类:
public class ObjectClass{
public List<Object> doSomething(List<Object> objects) {
for(int i = 0 ; i < objects.size();i++) {
Class<?> c = objects.get(i).getClass();
System.out.println("class name " + c.getCanonicalName());// i get name my class
System.out.println(((Example) objects.get(i)).name);
}
}
}
当我将强制转换示例更改为另一个类System.out.println(((c) objects.get(i)).name);
时
它没有用。
我的类可以自己调用不同,然后转换为Example将无效。 一般来说,我想获得名称的价值,而不知道如何命名类。但我选择具有字段名称的类(或通过具有注释)。 编辑:是一个问题,这是我的作业,我无法改变课程示例,我无法改变方法doSomething。
答案 0 :(得分:0)
欢迎来到多态的奇妙世界。您可以这样做:
interface Named
{
String getName();
}
public class Example implements Named
{
public String name;
@Override
public String getName()
{
return name;
}
}
public class AnotherExample implements Named
{
public String name;
@Override
public String getName()
{
return name;
}
}
然后你可以这样做:
System.out.println(((Named) objects.get(i)).getName());
当然我还建议您执行以下操作:
public List<Named> doSomething(List<Named> objects) {
这样你就可以做到这一点:
System.out.println(objects.get(i).getName());
澄清后编辑:
如果您无法添加自己的界面,请尝试以下方法:
Object foo = objects.get(i);
if( foo instanceof Example )
{
Example example = (Example)foo;
...do something with example...
}
else if( foo instanceof AnotherExample )
{
AnotherExample anotherExample = (AnotherExample)foo;
...do something with anotherExample...
}
else
{
assert false; //I do not know what class this is.
}
答案 1 :(得分:0)
如果您专门查看字段名称,您还可以通过反射迭代所有字段并访问正确的字段。
public List<Object> doSomething(List<Object> objects) {
for (int i = 0; i < objects.size(); i++) {
Class<?> c = objects.get(i).getClass();
for (Field field : c.getFields()) {
if ("name".equals(field.getName())) {
try {
System.out.println("class name " + c.getCanonicalName());// i get name my class
System.out.println(field.get(objects.get(i)));
} catch (Exception e) {
}
}
}
}
return null;
}