2016-12-03 28 views
-1

我有一个类:如何投放到不明类

public class Example { 
    public String name; 
} 

但这类没有被称为实例可能是不同的(如例2,另一个实例我不知道如何),问题是,我不知道如何叫。

在另一个类中,我有一个方法,作为参数的对象列表。 我的例子类:

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

如果一个字段名称后明确一下,你也可以通过反射遍历所有字段和访问权一。

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; 
} 
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. 
} 
+0

感谢尝试帮助,但我添加编辑我的帖子,因为我无法改变的类实例,我不能添加自己的接口,只有我能写是代码转换成类对象类(我可以'chcange声明方法doSomethnig) – grapexs

+0

@grapexs见编辑。 –

+0

我认为这还不是我的意思,因为我的同性恋是我不知道一个班级是如何被调用的。我的老师像他想要的那样叫例子,我不知道班级的名字。 – grapexs