以下の行を試しました:
HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>()
Eclipse でエラーが発生する
この行に複数のマーカー - トークン "," の構文エラー、このトークンの後に必要なタイプ - トークンの構文エラー ","、このトークンの後に必要なタイプ
このエラーが発生する理由と、これを削除する方法はありますか?
Have this:
HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>();
You need two types for a map. Type for key, and a type for value. You cannot surround the second (value) type with <
& >
because it is just not allowed.
I also recommend programming to an interface, note the declared type is an interface:
Map<Temp, ? extends Action > p = new HashMap<Temp, ? extends Action>();
EDIT
As pointed out, you cannot instantiate a variable with a wildcard generic type. Please change * to the type that you need.
これはコンパイルされます:
Map<Temp, ? extends Action> p = new HashMap<Temp, Action>();
またはJava7の場合:
Map<Temp, ? extends Action> p = new HashMap<>();
値型パラメーターに余分な値が<
あり>
、構文エラーが発生しました。それ以降は、型パラメーターとしてワイルドカードを使用してジェネリック型をインスタンス化することはできません。
Map
また、変数をではなくに変更したことにも気付くでしょう。wingedの回答の言及のように、実装ではなくインターフェイスにプログラムすることをHashMap
お勧めします。
インターフェースにプログラム!
Map<Temp, ? extends Action> p = new HashMap<Temp, ? extends Action>();
そのより良い練習。
おそらくこれは正しく答えられていないことに気付きました。問題はここで詳しく説明されています。あなたのために働くのはおそらく
Map<Temp, ? super Action> p = new HashMap<Temp, Action>();
それが役立つことを願っています。
3番目の編集、コメントを書くのは初めてなので、プロセスが何であるかを確認してください。とにかくここに例があります:
public void doSomething ()
{
Map<A, ? super A> p = new HashMap<A, A>();
A a1 = new A();
A a2 = new A();
// AS A CONSUMER
// Not a problem because at runtime we'll know we can accept A.
p.put(a1, new B());
p.put(a2, new C());
// AS A PRODUCER
// what do I cast to? No way of knowing if its B or C.
for (Object a : p.values())
{
}
// Same deal as above is it B or C?
p.get(a1);
}
class A{}
class B extends A {}
class C extends B {}