Java передает универсальный класс с перечисленным параметром enum в качестве параметра другому универсальному объекту - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь реализовать параметризованный класс в Java с enum в качестве параметра типа.Все работает нормально, за исключением того, что если вы посмотрите на код ниже, есть анонимный класс 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 (см. Код в «Классе».Обзор '), где это работает отлично.Я думаю, что в Android происходит некое волшебство.Я пытаюсь сделать то же самое - реализовать интерфейс Parcelable.Я только что составил этот пример без implements Parcelable и прочего, потому что я подумал, что, возможно, это всего лишь синтаксический сахар :).

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Посмотрите на следующее утверждение -

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>() { /*....*/ };
1 голос
/ 20 октября 2011

Сделайте метод нестатичным согласно сообщению компилятора, но у вас все равно есть несколько других серьезных проблем проектирования.Для create () требуется пояснение откуда-то, и вы не можете возвращать универсальные массивы.

EDIT Обычно я не публикую решения для кода, но вы, кажется, довольно смущены.

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];
        }
    };
}
0 голосов
/ 20 октября 2011

Я не эксперт по Android, но я уверен, что нет ничего волшебного в том, как это происходит в Android. Я думаю, вы просто запутались в связи между аргументами универсального типа и статикой.

Аргументы общего типа (например, T в вашем примере) принадлежат экземплярам класса, а не самому классу.

Статические члены (например, Creator в вашем примере) принадлежат самому классу , а не экземплярам класса.

Тот факт, что Creator является анонимным внутренним классом, реализующим универсальный интерфейс, является здесь чем-то вроде красной сельди. Проблема заключается в том, что независимо от того, что Creator является , если оно static, оно не может получить доступ к типу T.

...