【问题标题】:How Cast to unknow class如何投射到未知班级
【发布时间】:2016-12-03 20:38:36
【问题描述】:

我有一堂课:

public class Example {
    public String name; 
}

但是这个类不一定要叫Example 可能不一样(像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。

【问题讨论】:

    标签: java class casting


    【解决方案1】:

    如果您专门关注字段名称,您还可以通过反射遍历所有字段并访问正确的字段。

    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;
    }
    

    【讨论】:

      【解决方案2】:

      欢迎来到多态的奇妙世界。以下是您可以执行的操作:

      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.
      }
      

      【讨论】:

      • 感谢您的尝试帮助,但我在帖子中添加了编辑,因为我无法更改类示例,也无法添加自己的界面,我只能将代码写入类 ObjectClass(我无法更改声明方法 doSomethnig)
      • 我认为这仍然不是我的意思,因为我的同义词是我不知道如何调用一个类。我的老师像他想要的那样叫班级示例,我不知道班级的名字。
      • 好吧,如果这是作业,那么这几乎肯定是关于多态性,所以你的解决方案就在我回答的第一部分。您对分配有误解:要么实际上允许您更改 Example 并为其添加接口,要么您应该创建自己的 Example 类,在这种情况下,您当然可以添加任何您想要的接口想要。
      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2010-10-30
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多