TransWikia.com

Pass a generic class in method parameter

Stack Overflow Asked by Astha Srivastava on December 18, 2021

I have a method which accepts two values and converts it into key-value pair of a map and returns it to the calling method. The key is always String but the value can be of any Class. I can’t seem to convert the value into generic while accepting in method signature. Here’s my code:

private Map<String, Class<T>> mapBuilder(String key, T value) {
        Map<String, Class <T>> map = new HashMap<>();
        map.put(key, value);
        return map;
    }

Can someone tell what can be done instead?

2 Answers

Are you sure you want to have a map with Class as a value? If so, you have firstly define a generic type parameter <T> either at the class level (public class MyClass <T> { ... } or at the method level:

private <T> Map<String, Class<T>> mapBuilder(String key, T value) {
    Map<String, Class <T>> map = new HashMap<>();
    map.put(key, (Class<T>) value.getClass());
    return map;
}

Note the following:

  • As long as you want to add an instance of Class<T> to the map as a value, you have to get it from the T object.
  • There is a problem with the type incompatibility as long as getClass returns Class<?>, so an explicit casting is needed (also in the snippet above).

Finally, I'd prefer a solution with the wildcard parameter:

private Map<String, Class<?>> mapBuilder(String key, T value) {
    Map<String, Class <?>> map = new HashMap<>();
    map.put(key, value.getClass());
    return map;
}

Answered by Nikolas Charalambidis on December 18, 2021

The Class is too much. T already refers to the type:

private <T> Map<String, T> mapBuilder(String key, T value) {
   Map<String, T> map = new HashMap<>();
   map.put(key, value);
   return map;
}

Class<T> would refer to the class-object of T

Answered by Felix on December 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP