【发布时间】:2015-07-07 20:07:59
【问题描述】:
假设我有一个类Text,它实现了一个名为Drawable 的接口,其定义如下:
public interface Drawable {
public void draw (DrawConfig drawConfig);
}
我想要一个对象,它的作用类似于一个包含项目的数组,但它也实现了Drawable,以便能够编写drawables.draw(drawConfig) 并将调用转发给它的所有子代,而不必执行 for环形。所以我首先创建了一个如下所示的包装类:
public class Drawables implements Drawable {
private final Array<Drawable> items = new Array<Drawable>();
public void add (final Drawable value) {
this.items.add(value);
}
@Override
public void draw (final DrawConfig drawConfig) {
for (final T item : this.items)
item.draw(drawConfig);
}
}
第一个问题是因为它是一个包装器,它没有任何 Array 类方法,我必须手动添加我需要的方法(例如示例中的 add()以上)。
第二个问题是如果我只存储Text对象在里面,我不能写:
for (Text t : drawables)
t.setText("blablabla");
这意味着我必须创建 another 数组,我最终会为此创建两个数组。我想避免这种情况,所以我考虑使用泛型,因为 Array 类是泛型的,我将 Drawables 类变成了这个:
public class Drawables<T extends Drawable> extends Array<T> implements Drawable {
@Override
public void draw (final DrawConfig drawConfig) {
for (final T item : this.items) // Line 17
item.draw(drawConfig);
}
}
现在我可以写了:
Drawables<Text> drawables = new Drawables<Text>();
drawables.add(new Text());
drawables.add(new Text());
for (Text t : drawables)
t.setText("blablabla");
drawables.draw(drawConfig);
然后编译!! 除了在运行时我收到以下错误:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [La.b.c.ui.Drawable;
at a.b.c.Drawables.draw(Drawables.java:17)
at a.b.c.ui.components.Text_UseTest.render(Text_UseTest.java:80)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
请参阅我的代码中第 17 行的注释。
有什么问题?甚至有可能实现我想做的事情吗?
【问题讨论】:
-
什么是
Array<T>?这不是内置的Array类。 -
@LucasRoss,但它可以表现得像一个。这就是一个接口状态
-
我不能 100% 确定您的自定义
Array<T>类是如何工作的,但是在这个 StackOverflow 问题中有一些关于处理数组和泛型的信息:stackoverflow.com/questions/30388464/…
标签: java arrays generics libgdx