Во-первых, я могу указать, что <T extends Object>
можно заменить просто <T>
, потому что все в Java, включая дженерики, должно быть объектом.
Вторая часть, с которой вы действительно близкиэто Class<?> c
.Это говорит о том, что вы можете передать любой класс, и он вернет любой тип T
.c.cast(instance)
можно заменить на (T) instance
, если вы считаете, что это выглядит лучше, но на самом деле есть разница, которая более детально описана здесь: Java Class.cast () и оператор приведения .
Окончательный код выглядит следующим образом:
public class SingletonFactory {
public static Map<String,Object> objectFactory = new HashMap<String, Object>();
public static <T> T getInstance(Class<T> c){
String key = c.toString();
Object instance= objectFactory.get(key);
if(instance == null){
synchronized (c) {
try{
instance = c.newInstance();
objectFactory.put(key, instance);
}catch(IllegalAccessException | InstantiationException e){
throw new RuntimeException("Exception while creating singleton instance for class : "+key+" - Exception Message : "+e);
}
}
}
return c.cast(instance);
// or
return (T) instance;
}
}
Также, если вы действительно хотите, вы можете сохранить все в своем исходном коде и привести экземпляр к T
в конце метода, и он должен работать,Единственное, что ваши вызовы методов будут выглядеть как SingletonFactory.getInstance<Foo>(Foo.class)
вместо SingletonFactory.getInstance(Foo.class)
.Это из-за Class<?>
в исходном коде вместо Class<T>
.