Java Hashmap armazena apenas o valor de um tipo específico na chave

Estou procurando criar uma classe Hashmap que permita armazenar chaves e valores. No entanto, o valor só pode ser armazenado se corresponder a um tipo específico e o tipo depender doruntime value da chave. Por exemplo, se a chave forEMAIL(String.class), o valor armazenado deve ser do tipoString.

Tenho o seguinte ENUM personalizado:

public enum TestEnum {
    TDD,
    BDD,
    SHIFT_RIGHT,
    SHIFT_LEFT;
}

Criei a seguinte classe:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class test {

    private static final Map<ValidKeys, Object> sessionData = new HashMap<>();

    public enum ValidKeys {
        EMAIL(String.class),
        PASSWORD(String.class),
        FIRST_NAME(String.class),
        LAST_NAME(String.class),
        CONDITION(TestEnum.class);

        private Class type;
        private boolean isList;
        private Pattern pattern;

        ValidKeys(Class<?> type, boolean isList) {
            this.type = type;
            this.isList = isList;
        }

        ValidKeys(Class<?> type) {
            this.type = type;
        }
    }

    public <T> void setData(ValidKeys key, T value) {
        sessionData.put(key,value);
    }


    public Object getData(ValidKeys key) {
        return key.type.cast(sessionData.get(key));
    }


    public static void main(String[] args) {
        test t = new test();
        t.setData(ValidKeys.CONDITION,TestEnum.TDD);
        System.out.println(t.getData(ValidKeys.CONDITION));
    }
}

Gostaria de usar métodos comosetData egetData e armazene valores emsessionData. Além disso, quero garantir se o valor é uma lista de objetos e também armazenados corretament

Também estou lutando para evitar toString, basicamente preciso de um getData genérico que possa funcionar sem a conversão de tip