I am trying to store objects that are a sub-class of an abstract class, but there is a problem illustrated here:
abstract class Letter {
public void store_object(Letter letter) {
HashMap<Class<? extends Letter>, ? extends Letter> map = new HashMap<>();
map.put(letter.getClass(), letter); <-- this line throws an error
}
}
class A extends Letter {}
class B extends Letter {}
The reason map.put
throws an error is that letter
is not a sub-class of Letter
(it is a direct instance of Letter
).
Is there a way to change the method parameter to be a generic sub-class of Letter? Something like:
public void store_object(? extends Letter letter) {
or
public void store_object(Object<? extends Letter> letter) {
The error is:
no suitable method found for put(Class<CAP#1>,NewClass19.Letter)
method Map.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
method AbstractMap.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
method HashMap.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends NewClass19.Letter from capture of ? extends NewClass19.Letter
CAP#2 extends NewClass19.Letter from capture of ? extends NewClass19.Letter