Just came across a place where I'd like to use generics and I'm not sure how to make it work the way I want.
I have a method in my data layer that does a query and returns a list of objects. Here's the signature.
public List getList(Class cls, Map query)
This is what I'd like the calling code to look like.
List<Whatever> list = getList(WhateverImpl.class, query);
I'd like to make it so that I don't have to cast this to a List<Whatever>
coming out, which leads me to this.
public <T> List<T> getList(Class<T> cls, Map query)
But now I have the problem that what I get out is always the concrete List<WhateverImpl>
passed in whereas I'd like it to be the Whatever
interface. I tried to use the super keyword but couldn't figure it out. Any generics gurus out there know how this can be done?
The question mark (?) is known as the wildcard in generic programming. It represents an unknown type. The wildcard can be used in a variety of situations such as the type of a parameter, field, or local variable; sometimes as a return type.
In generic code, the question mark (?), called the wildcard, represents an unknown type. The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific).
We can use the Java Wildcard as a local variable, parameter, field or as a return type. But, when the generic class is instantiated or when a generic method is called, we can't use wildcards. The wildcard is useful to remove the incompatibility between different instantiations of a generic type.
A Generic class can have muliple type parameters.
You need to define the method like this:
public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With