共通の親から拡張された複数のクラスに一種のインターン ファクトリを実装しようとしています。ロジックの多くは同じですが、ルックアップは静的である必要があるため、実際には継承できません。望ましい構文は次のようなものです。
Car c = AbstractClass.valueOf(Car.class, "Ford");
Car には車に関連する特定のメソッドがありますが、インスタンスは共通のキャッシュに保存されます。これが私がこれまでに持っているものです。私のコンパイルエラーは、コンストラクターのプットにあります:
「型 Map のメソッド put(String, capture#3-of ? extends AbstractClass) は、引数 (String, AbstractClass) には適用できません」
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public abstract class AbstractClass {
private static Map<Class<? extends AbstractClass>, LinkedHashMap<String, ? extends AbstractClass>> map = new HashMap<Class<? extends AbstractClass>, LinkedHashMap<String, ? extends AbstractClass>>();
private static synchronized <T extends AbstractClass> Map<String, T> getNameMap(Class<T> clazz) {
LinkedHashMap<String, T> nameToEnum = (LinkedHashMap<String, T>) map.get(clazz);
if (nameToEnum == null) {
nameToEnum = new LinkedHashMap<String, T>();
map.put(clazz, nameToEnum);
}
return nameToEnum;
}
public static <T extends AbstractClass> T valueOf(Class<T> clazz, String name) {
return getNameMap(clazz).get(name);
}
public static <T extends AbstractClass> Collection<T> VALUES(Class<T> clazz) {
return getNameMap(clazz).values();
}
public static <T extends AbstractClass> Set<T> SORTED_VALUES(Class<T> clazz) {
return new TreeSet<T>(getNameMap(clazz).values());
}
AbstractClass(String name) {
AbstractClass.getNameMap(this.getClass()).put(name, this);
}
}