簡體   English   中英

Java將帶有parameterzied枚舉的泛型類作為參數傳遞給另一個泛型對象

[英]Java passing generic class with parameterzied enum as parameter to another generic object

我試圖用枚舉作為類型參數在Java中實現參數化類。 一切正常,但是,如果你看下面的代碼,就會有Car.Creator帶參數K匿名類Car.Creator 但是當然,應該有CarObject<T>而不是K ,但它並不容易。 如果我把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了這個例子,沒有implements Parcelable和其他東西,因為我可能它只是一個語法糖:)。

根據編譯器消息使方法非靜態,但無論如何您還有其他幾個主要的設計問題。 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];
        }
    };
}

看下面的陳述 -

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>() { /*....*/ };

我不是Android專家,但我很確定在Android中如何發生這種情況並不神奇。 我認為你只是對泛型類型參數和靜態之間的關系感到困惑。

泛型類型參數(如示例中的T )屬於類的實例 ,而不屬於類本身。

靜態成員(如示例中的Creator )屬於類本身 ,而不屬於的實例。

Creator是一個實現通用接口的匿名內部類的事實在這里是一個紅色的鯡魚。 問題很簡單, 無論Creator是什么 ,只要它是static ,它就無法訪問類型T

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM