Java将带有parameterzied枚举的泛型类作为参数传递给另一个泛型对象

时间:2011-10-19 23:17:25

标签: java generics enums parameterization

我试图用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和其他东西的例子,因为我可能只是一个语法糖:)。

3 个答案:

答案 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

相关问题