关于java接口的一个问题希望大佬帮忙回答一下

代码如下
public class MapDemo {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("王","18");
         map.put("李","18");
        map.put("吗","18");
         map.put("找","18");
       Set<String> set= map.keySet();


    }
}

我比较疑惑的一点是 set集合不是应该通过实现类进行实现的吗
为什么可以不用new 直接就可以  Set<String> set= map.keySet();
不是应该 Set<String> set = new HashSet<>();
set = map.keySet();吗?
求大佬解答疑问
谢谢

    

这里就涉及到类的多态特性了,在JAVA里,用通俗的语言说就是,一个具体类的实例,可以赋给其本身类引用或父类的引用,明白了吗?你例子中的 map.keySet()是一个具体类的实例,那么是可以赋给其父类Set<String> 引用的。