我试图用enum作为类型参数在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接口。我刚刚编写了这个没有implements Parcelable
和其他东西的例子,因为我可能只是一个语法糖:)。
答案 0 :(得分:1)
根据编译器消息使方法非静态,但无论如何您还有其他几个主要的设计问题。 create()需要某个地方的clazz,你不能返回通用数组。
编辑我通常不会发布代码解决方案,但您似乎很困惑。
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 final Car.Creator<CarObject<T>> Creator = new Car.Creator<CarObject<T>>()
{
@Override
public CarObject<T> create()
{
return new CarObject<T>(typeClass);
}
@Override
public CarObject<T>[] newArray(int size)
{
return new CarObject[size];
}
};
}
答案 1 :(得分:1)
请查看以下声明 -
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
您似乎在Car类中将泛型类创建者定义为静态内部类。并且,在这里你试图使用它并实例化它,所以不能在这里使用 K ,除非它是在某处定义的类或接口。
我认为以下示例解释了我的意思 -
// you are not defining a class here so no parameter instead use a real class
public static final List<K> list = new List<K>() { /*....*/ };
答案 2 :(得分:0)
我不是Android专家,但我很确定在Android中如何发生这种情况并不神奇。我认为你只是对泛型类型参数和静态之间的关系感到困惑。
泛型类型参数(例如示例中的T
)属于类的实例,而不属于类本身。
静态成员(例如示例中的Creator
)属于类本身,而不属于该类的实例。
Creator
是一个实现通用接口的匿名内部类的事实在这里有点像红色鲱鱼。问题很简单,无论Creator
是什么,只要它是static
,它就无法访问类型T
。