0

我正在尝试使用枚举作为类型参数在 Java 中实现参数化类。一切正常,除了,如果你看下面的代码,有一个Car.Creator带有参数的匿名类K。但当然,K应该有,而不是CarObject<T>,但这并不容易。如果我放在CarObject<T>' Ks 的位置,那么我会遇到语法错误。有人可以解释一下这样的事情是否可行,并可能提供一些代码示例。

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 文档的例子(查看“类概述”中的代码),它工作得很好。我认为 Android 的幕后发生了一些神奇的事情。我正在尝试做同样的事情——实现 Parcelable 接口。我只是在没有其他东西的情况下编造了这个例子implements Parcelable,因为我认为它可能只是一个语法糖:)。

4

3 回答 3

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];
        }
    };
}
于 2011-10-19T23:27:57.260 回答
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

看起来你有一个通用类 Creator 定义为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>() { /*....*/ };
于 2011-10-19T23:40:32.477 回答
0

我不是 Android 专家,但我很确定这在 Android 中是如何发生的并没有什么神奇之处。我认为您只是对泛型类型参数和静态变量之间的关系感到困惑。

泛型类型参数(如T您的示例中)属于类的实例,而不是类本身。

静态成员(如Creator您的示例中)属于类本身,而不是类的实例。

Creator是一个实现泛型接口的匿名内部类的事实在这里有点红鲱鱼。问题很简单,不管是什么Creator只要是static,就无法访​​问 type T

于 2011-10-20T00:14:35.050 回答