我正在尝试使用枚举作为类型参数在 Java 中实现参数化类。一切工作正常,除了,如果你看下面的代码,有一个匿名类 Car.Creator
参数 K
。但当然,而不是 K
,应该有CarObject<T>
,但这并不那么容易。如果我输入 CarObject<T>
在K
的地方,然后我得到语法错误。有人可以解释一下这样的事情是否可能,并可能提供一些代码示例。
public class CarObject<T extends Enum<T>>
{
public Map<T, String> values;
private Class<T> typeClass;
public CarObject(Class<T> clazz)
{
typeClass = clazz;
values = new EnumMap<T,String>(typeClass);
}
public static final Car.Creator<K> Creator = new Car.Creator<K>()
{
public K create()
{
return new K();
}
public K[] newArray(int size)
{
return new K[size];
}
}
}
我可以给你一个官方的例子Android documentation (查看“类概述”中的代码)这工作得很好。我认为 Android 背后隐藏着一些魔法。我正在尝试做完全相同的事情 - 实现 Parcelable 接口(interface)。我刚刚编了这个例子,没有 implements Parcelable
和其他东西,因为我认为这可能只是一个语法糖:)。
最佳答案
看下面的语句 -
public static final Car.Creator<K> Creator = new Car.Creator<K>() {
public K create() {
return new K();
}
public K[] newArray(int size) {
return new K[size];
}
}; // <------ missing a semicolon here
看起来您有一个通用类Creator,在类Car中定义为静态内部类。并且,在这里您尝试使用它并实例化它,因此不能在这里使用 K ,除非它是在某处定义的类或接口(interface)。
我认为下面的例子解释了我的意思 -
// you are not defining a class here so no parameter instead use a real class
public static final List<K> list = new List<K>() { /*....*/ };
关于Java 将带有参数化枚举的泛型类作为参数传递给另一个泛型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829363/