誰かがこの混乱から私を助けることを願っています。Javaジェネリックスのパラメータを渡す
私はこの方法で作られた:キーとして使用するクラスがMyInterfaceにパラメータとして使用するクラスと同じであることを確認するために、T PARAMTER使用さ
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
を。
私はもちろん、キーとは異なるクラス、および対応するMyInterfaceの実装をマップに渡したいと思います。
しかし、タイプパラメータのために構文エラーが発生しても機能しません。ここにコードがあります、私は自己説明的であることを願っています。
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<Class<?>, MyInterface<?>> map = new HashMap<Class<?>, MyInterface<?>>();
// Map<Class<Object>, MyInterface<Object>> map = new HashMap<Class<Object>, MyInterface<Object>>();
map.put(Object.class, new MyObjectImpl());
//if I use Map<Class<Object>, MyInterface<Object>> I get a compiler error here
//because map<String> is not map<Object> basically
map.put(String.class, new MyStringImpl());
//this would be possible using <?>, which is exactly what I don't want
// map.put(String.class, new MyIntegerImpl());
//<?> generates anyways a compiler error
myMethod(map);
}
//use T to make sure the class used as key is the same as the class of the parameter "object" in doSomething
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
interface MyInterface<T> {
void doSomething(T object);
}
static class MyObjectImpl implements MyInterface<Object> {
@Override
public void doSomething(Object object) {
System.out.println("MyObjectImpl doSomething");
}
}
static class MyStringImpl implements MyInterface<String> {
@Override
public void doSomething(String object) {
System.out.println("MyStringImpl doSomething");
}
}
static class MyIntegerImpl implements MyInterface<Integer> {
@Override
public void doSomething(Integer object) {
System.out.println("MyIntegerImpl doSomething");
}
}
}
クラス名は通常、オーバーエンジニアリング(例えば、それは意味の症状がある(以下の例のように)
MapConstraints.constrainedMap
を用いることであろうこれは強制できません)。 – Romainこれについては忘れて、これは動作しません。ジェネリックスは同質のマップしか定義できません。エントリごとに何かを強制することはできません。すべてのマップエントリについて同じことを実行するだけです。 –
@Romeよく、実際の名前はそうではなく、ちょうど明確な例を作るためにそれを書きました。しかしあなたのコメントも同様に適用される可能性があります。 1つの実装だけを意味するものは何を意味しますか?3つはありますか? – Ixx