【问题标题】:List of Classes implementing an Interface实现接口的类列表
【发布时间】:2012-11-30 01:56:55
【问题描述】:

有没有办法实现类似的东西

    List<Class<? implements MyInterface>> ClassList = new ArrayList<Class<? implements MyInterface>>(); 

我的目标是从该列表创建一个哈希图,其中键是类的 toString 方法(在 MyInterface 中定义),值是类本身。此类的每个对象的 toString 方法都返回相同的结果。这样,我可以通过搜索正确的字符串来使用映射创建类的实例。

感谢您的帮助, 问候

【问题讨论】:

  • 看起来是一种复杂的方式来达到你的最终目标。也许你可以有一个枚举列表。这些枚举可以给出你想要的类名,你可以通过反射创建一个实例。保留 toString() 方法以显示有用的信息,例如。用于调试目的。
  • 让我得到你的目标......你有一个接口MyInterface 有方法toString。现在ClassA implements MyInterface & 假设类的 toString() 返回“ClassA”。因此,从您的哈希图中,您将搜索键“ClassA”的值,它应该是 ClassA 的类类型。而不是你想创建一个返回类类型的实例(在我们的例子中是 ClassA)......是这样的......?
  • 是的 hemu,那是我的目标,但我目前正在搜索有关 PhiLho 建议的方法的信息。如果你想做到这一点,你会怎么做?

标签: java list class interface


【解决方案1】:
List<Class<? implements MyInterface>> ClassList = new ArrayList<Class<? implements MyInterface>>(); 

应该是

List<Class<? extends MyInterface>> ClassList = new ArrayList<Class<? extends MyInterface>>(); 

在泛型世界中没有 implements 关键字。如果你想要一个实现接口的类型参数,使用extends关键字来表示。

【讨论】:

    【解决方案2】:

    由于您似乎对我解释的方式感兴趣,这里有一个快速实现,以验证它是否可以完成......

    import java.util.ArrayList;
    import java.util.List;
    
    enum NumberClass
    {
      ONE("One"),
      TWO("Two"),
      THREE("Three");
    
      private final String className;
    
      NumberClass(String name)
      {
        className = name;
      }
    
      String getName()
      {
        return className;
      }
    }
    
    public class Test
    {
      public static void main(String[] args)
      {
        List<NumberClass> numbers = new ArrayList<NumberClass>();
    
        numbers.add(NumberClass.ONE);
        numbers.add(NumberClass.THREE);
        numbers.add(NumberClass.TWO);
        numbers.add(NumberClass.ONE);
        numbers.add(NumberClass.THREE);
        numbers.add(NumberClass.ONE);
        numbers.add(NumberClass.TWO);
    
        SomeNumber[] nbs = new SomeNumber[numbers.size()];
        int i = 0;
        for (NumberClass nbC : numbers)
        {
          SomeNumber nb;
          try
          {
             nb = (SomeNumber) Class.forName(nbC.getName()).newInstance ();
             nbs[i++] = nb;
          }
          // Cleanly handle them!
          catch (InstantiationException e) { System.out.println(e); }
          catch (IllegalAccessException e) { System.out.println(e); }
          catch (ClassNotFoundException e) { System.out.println(e); }
        }
        for (SomeNumber sn : nbs)
        {
          System.out.println(sn.getClass().getName() + " " + sn.getValue());
        }
      }
    }
    
    // The following must be in their own files, of course
    public interface SomeNumber
    {
      int getValue();
    }
    
    public class One implements SomeNumber
    {
      public int getValue() { return 1; }
    }
    public class Two implements SomeNumber
    {
      public int getValue() { return 2; }
    }
    public class Three implements SomeNumber
    {
      public int getValue() { return 3; }
    }
    

    如果它不能回答您的问题,我希望将其视为教育材料。 :-)

    【讨论】:

    • 非常感谢您帮助 PhiLho 并花时间编写了一个很好的示例代码,这非常有用。我的实现目前仍然使用我上面描述的方法,但当我完成当前任务时,我肯定会改变它。您的解决方案似乎更专业了,再次打招呼
    猜你喜欢
    • 2020-03-13
    • 2014-08-25
    • 2015-08-27
    • 1970-01-01
    • 2011-10-21
    • 2019-07-22
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多