我正在尝试使用类型ArrayList
创建一个TileEntity
(显然是java)(是的,这是一个Minecraft mod)。但我还需要添加到ArrayList
的对象来实现某个接口。
我想到的第一个选项是创建一个实现接口的TileEntity
的抽象子类,并将其用作ArrayList
类型。但是考虑到人们通常创建自己的TileEntity
子类并将它们用作通常子类的类,并且我希望人们能够挂钩到我的mod,我不能指望它们除了子类之外TileEntity
。
我目前的解决方案是在添加之前检查if(object instanceof MyInterface)
,但这看起来很难看。当然,有一种方法可以设置ArrayList
的类型,以要求对象既是TileEntity
的子类又是MyInterface
的实现者。
答案 0 :(得分:6)
您可以对使用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 :(得分:0)
您可以在界面中添加所需的TileEntity
方法,然后只需创建界面的ArrayList
即可。可能有一种使用泛型以更好的方式解决问题的奇特方式,但我不确定如何。
编辑: dcernahoschi的解决方案要好得多。