0

I am studying Generics in java. I made a Map and initialized with 'new HashMap>()'. After that, I made an ArrayList to put into that variable. However, this code can not compile.

error message is:

"The method put(String, capture#1-of ? extends List) in the type Map> is not applicable for the arguments (String, List)"

on Map.put() method.

My code is below.

package org.owls.generic.main;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> tmpArr = new ArrayList<String>();
        tmpArr.add("A");
        tmpArr.add("B");
        List<?> value = new ArrayList<String>(tmpArr);
        Map<String, ? extends List<String>> testMap = new HashMap<String, List<String>>();
        testMap.put("K", value);
    }
};

I can not understand why compiler looks type, even I assigned inheritanced Class which is 'List'.

Sorry for my poor English and edit will be welcomed. Thanks for your answer:D

Juneyoung Oh
  • 7,318
  • 16
  • 73
  • 121

1 Answers1

3

You cannot put anything except null into a generic type with the ? extends ... parameter. This is basic Generics -- since the type parameter is unknown, you cannot put anything into it because whatever you try to put is not guaranteed to be a subtype of that unknown type.

Recall the PECS (Producer extends, Consumer super) rule. ? extends can only be used for producers. Putting something in is a Consumer.

newacct
  • 119,665
  • 29
  • 163
  • 224