【问题标题】:Create arraylist of class and interface创建类和接口的arraylist
【发布时间】:2013-04-03 19:14:52
【问题描述】:

我正在尝试创建一个ArrayList(显然是java)类型为TileEntity(是的,这是一个Minecraft mod)。但我还需要添加到ArrayList 的对象来实现某个接口。

想到的第一个选项是创建一个实现接口的TileEntity 的抽象子类,并将其用作ArrayList 类型。但考虑到人们通常会创建自己的 TileEntity 子类并将其用作他们通常子类的类,并且我希望人们能够连接到我的 mod,我不能指望他们会继承 @987654328 之外的任何东西@。

我目前的解决方案是在添加之前检查if(object instanceof MyInterface),但这看起来很难看。当然有一种方法可以设置 ArrayList 的类型以要求对象既是 TileEntity 的子类又是 MyInterface 的实现者。

【问题讨论】:

  • 你用的是哪个版本的java?
  • 这里有类似的问题 - stackoverflow.com/questions/6592832/…
  • 我使用的是 java 6. 7 不适用于 mac os 上的 minecraft 开发。 lwjgl 绑定到 awt 画布的方式存在一些奇怪的错误。

标签: java generics arraylist


【解决方案1】:

您可以将使用ArrayList 的方法或类设为通用。比如一个泛型方法:

public <T extends TileEntity & MyInterface> void doStuffWith(T obj) {
    List<T> yourList = new ArrayList<T>();
    yourList.add(obj);
    ...//more processing
}

还有一个泛型类:

public class ArrayListProcessor<T extends TileEntity & MyInterface> {
   List<T> theList;

   public void processList(T obj) {
      theList.add(obj);
      ...
   }

   public void someOtherMethod() {
      T listElem = theList.get(0);
      listElem.callMethodFromTileEntity();//no need to cast
      listElen.callMethodFromMyInterface();//no need to cast
   }
}

...//somewherein your code
//SomeObj extends TileEntity and implements MyInterface 
ArrayListProcessor<SomeObj> proc = new ArrayListProcessor<SomeObj>(); 

【讨论】:

  • +1。本 Java 教程 docs.oracle.com/javase/tutorial/java/generics/bounded.html 讨论了多个边界
  • 完美!谢谢。我不知道泛型有这种能力。
  • 嗯...实际上,我现在遇到了问题。 arraylist 实际上是一个实例变量,我不能让类使用泛型类型,因为这样只能添加我的类初始化的 T。虽然,在用于添加到 arraylist 的方法上采用这种方式是可行的。只是意味着我必须在课堂上的所有地方都投射到我的界面。
  • 我不明白。为什么要铸造?该对象应该已经实现了MyInterface。从类中发布一些示例代码:方法和您需要转换的位置。
  • 这很简单。我不能给整个类一个泛型类型,因为那样我就绑定到一个 T 类。因此我只能创建一个现有类型的 ArrayList。所以我必须在 TileEntity 和 MyInterface 之间做出选择。因此,当我想使用接口方法时,除了将对象添加到列表的方法之外,类中的任何地方都必须强制转换为 MyInterface。对不起,我不能发布代码。我现在离开了开发环境。
【解决方案2】:

您可以在您的界面中添加您需要的TileEntity 的任何方法,只需将您的界面的ArrayList 设置为即可。可能有一些奇特的方法可以使用泛型以更好的方式解决问题,但我不确定如何。

编辑: dcernahoschi 的解决方案要好得多。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 2020-06-23
    • 2018-04-24
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2011-12-15
    相关资源
    最近更新 更多