1 Antwort

Zur Laufzeit gibt es den generischen Typ nicht mehr. Daher kannst du ihn auch nicht in Kombination mit dem instanceof-Operator verwenden.

Stattdessen kannst du aber die isAssignableFrom-Methode verwenden. Dafür brauchst du die Klasseninformation zum zu prüfenden Objekt und die Klasseninformation zum generischen Typ.

public boolean isInstanceOf(Class<T> type, Object objectToCheck) {
  return type.isAssignableFrom(objectToCheck.getClass());
}

// usage:
if (someObject.isInstanceOf(String.class, "some value")) {
  System.out.println("Is String");
}

Alternativ würde es ebenso mit der isInstance-Methode klappen.

type.isInstance(objectToCheck)

Im Hinblick auf deinen Code würde ich dir übrigens dazu raten, ein paar Redundanzen loszuwerden. Da sich das name-Feld im Namen offensichtlich nie ändert, könnte es als Konstante gekennzeichnet werden und den Key könntest du direkt im Konstruktor in einem weiteren Feld speichern.

private final String challengesKey;

// constructor
challengesKey = "Challenges.Settings." + getName();

Sollte er sich zukünftig einmal ändern, brauchst du nur noch eine Stelle im Code ändern und die Anzahl an Zeilen, in denen Tippfehler auftauchen können, reduziert sich erheblich.

Außerdem brauchst du die Konfiguration nicht mehrmals einlesen, wenn du den Wert doch bereits in obj gespeichert hast.

if (config.contains(challengesKey)) {
  Object challenges = config.get(challengesKey);

  if (/* check type ... */) {
    setValue((T)challenges);
  }
}