Wpis z mikrobloga

Zaczynam się uczyć generyków i mam problem z poprawieniem tego kodu

public static Map loadDataJson(String JSON_PATH, Class myClass) throws FileNotFoundException {
Map dataHashMap = new HashMap<>();

JsonReader jsonReader = new JsonReader(new FileReader(JSON_PATH));
Gson gson = new Gson();
return dataHashMap = gson.fromJson(jsonReader, new TypeToken>() {
}.getType());
}

Wywołanie metody:

MainPanelController.sharedData.setAllMin(JsonDB.loadDataJson("./Data.json",User.class));
W jaki sposób przekazać nazwe klasy ? bo z tym sposobem kod się nie kompiluje, dzięki za pomoc

#java #programowanie
  • 14
@notoide: Dziwne, że w ogóle ta funkcja Ci się skompilowała. Bo u mnie się nie kompiluje już przy

Map dataHashMap = new HashMap<>();
a to dlatego, że myClass nie jest typem.
nawet jakbyś zapisał to tak

Map> dataHashMap = new HashMap<>();
to i tak masz błąd kompilacji ze względu na różnicę w zwracanych typach
Skompiluje Ci się natomiast coś takiego:

public static Map loadDataJson(String JSON_PATH) throws FileNotFoundException {
Map dataHashMap =
@Porana123: tak, ale już działa
@piszczalka: wow działa tylko musiałem jeszcze rzutować funkcje jako Hashmap czyli mam teraz tak

MainPanelController.sharedData.setAllMin((HashMap) JsonDB.loadDataJson("./Data.json"));

Jest tylko jeszcze problem, chyba gson coś miesza bo zamiast dodawać nowe obiekty User dodaje mi LinkedTreeMap do hashmapy..
@notoide: Wydaje mi się, że funkcja MainPanelController.sharedData.setAllMin nie musi przyjmować HashMap wystarczy zwykłe Map - zmień jej definicję, unikniesz rzutowania. Rzutowanie w górę jest prawie zawsze złe, korzystaj z polimorfizmu wszędzie, gdzie tylko możesz.
@piszczalka: Znalazłem jeszcze takie rozwiązanie, że podajemy Type jako parametr, zmieniłem też zmienną allMiners z hashmap na map dzięki czemu nie trzeba castować, działa to pięknie, wadą jest korzystanie z reflecta (Type)

public static Map loadDataJson(String JSON_PATH, Type type) throws FileNotFoundException {
JsonReader jsonReader = new JsonReader(new FileReader(JSON_PATH));
Gson gson = new Gson();

return gson.fromJson(jsonReader, type);
}

MainPanelController.sharedData.setAllMin( JsonDB.loadDataJson("./Data.json",new TypeToken>(){}.getType()));