[英]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.