0

型パラメーターとして列挙型を使用して、Java でパラメーター化されたクラスを実装しようとしています。以下のコードを見ると、Car.Creatorparameter を持つ匿名クラスがあることを除いて、すべて正常に動作します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他のものを使わずに作っただけです。

4

3 に答える 3

1

コンパイラ メッセージに従ってメソッドを非静的にしますが、他にもいくつかの主要な設計上の問題があります。create() にはどこかからのクラズが必要であり、ジェネリック配列を返すことはできません。

編集私は通常、コードソリューションを投稿しませんが、かなり混乱しているようです。

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

クラス Car の静的内部クラスとして定義されたジェネリッククラス Creatorがあるようです。そして、ここでそれを使用してインスタンス化しようとしているので、どこかで定義されたクラスまたはインターフェースでない限り、ここで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 に答える