Java 在静态初始值设定项中将子类添加到超级类型的ConcurrentHashMap?

Java 在静态初始值设定项中将子类添加到超级类型的ConcurrentHashMap?,java,static,hashmap,Java,Static,Hashmap,(我已经尝试将注册表2的声明更改为拥有?扩展人员 现在的错误是: 类型映射中的方法put(String,ConcurrentMap)不适用于参数(String,ConcurrentMap),因为集合不是集合。换句话说: 有没有一种方法可以把家庭放到hashmap中 将其声明为集合,因为集合不是集合。换句话说: 有没有一种方法可以把家庭放到hashmap中 将其声明为集合家庭可转换为人,但集合不能转换为集合 如果它是可转换的,您将能够不安全地将不同的派生tyupe添加到铸造集合中 相反,您可以使用

(我已经尝试将
注册表2
的声明更改为拥有
?扩展人员

现在的错误是:
类型映射中的方法put(String,ConcurrentMap)不适用于参数(String,ConcurrentMap)

,因为
集合
不是
集合。换句话说:


有没有一种方法可以把家庭放到hashmap中


将其声明为
集合
,因为
集合
不是
集合
。换句话说:


有没有一种方法可以把家庭放到hashmap中


将其声明为
集合

家庭
可转换为
,但
集合
不能转换为
集合

如果它是可转换的,您将能够不安全地将不同的派生tyupe添加到铸造集合中

相反,您可以使用集合类型的协变视图:

public class Together {
    private static ConcurrentMap<String, Collection<Family>> familyMap= new ConcurrentHashMap<String, Collection<Family>>();
    private static ConcurrentMap<String, ConcurrentMap<String, Collection<People>>> registry2 = new ConcurrentHashMap<String, ConcurrentMap<String, Collection<People>>>();

    static {
        registry2.put(Family.class.toString(), familyMap); 
    }
}

ConcurrentMap
family
可转换为
people
,但
Collection
不能转换为
Collection

如果它是可转换的,您将能够不安全地将不同的派生tyupe添加到铸造集合中

相反,您可以使用集合类型的协变视图:

public class Together {
    private static ConcurrentMap<String, Collection<Family>> familyMap= new ConcurrentHashMap<String, Collection<Family>>();
    private static ConcurrentMap<String, ConcurrentMap<String, Collection<People>>> registry2 = new ConcurrentHashMap<String, ConcurrentMap<String, Collection<People>>>();

    static {
        registry2.put(Family.class.toString(), familyMap); 
    }
}
ConcurrentMap试试这个:

people.java

together.java

import java.util.ArrayList;
导入java.util.Collection;
导入java.util.concurrent.ConcurrentHashMap;
导入java.util.concurrent.ConcurrentMap;
一起上公共课{
私有静态集合familyList=新的ArrayList();
公共静态ConcurrentMap尝试以下方法:

people.java

together.java

import java.util.ArrayList;
导入java.util.Collection;
导入java.util.concurrent.ConcurrentHashMap;
导入java.util.concurrent.ConcurrentMap;
一起上公共课{
私有静态集合familyList=新的ArrayList();


公共静态ConcurrentMapClassName应该是大写的。第二个问题与第一个问题相同。解决方案应该是:私有静态ConcurrentMapHmm,对我不起作用。我将在一个新问题中发布这个问题。如果你能在那里回答,你可以得到正确的答案。类名应该是大写的。第二个问题与第一个相同。解决方案应该是:私有静态ConcurrentMapHmm,对我不起作用。我将在一个新问题中发布这个问题。如果你能在那里回答,你可以得到正确的答案。有没有一种方法可以将family放入hashmap?@StephenD将其声明为
集合
。有没有一种方法可以将family放入hashmap?@StephenD将其声明为一个
集合
。感谢您澄清这一点!我编辑了这个问题,毫无疑问将参考您对我问题第一部分的答案!太好了。我很高兴我能提供帮助。如果此解决方案有帮助,请选择此作为正确答案。:)谢谢你澄清!我编辑了这个问题,毫无疑问,我会在问题的第一部分参考你的答案!太好了。我很高兴能提供帮助。如果这个解决方案有帮助,请选择这个作为正确答案。:@StephenD:这是什么?安全防范什么?我不确定我的意思。。。haha@StephenD:这是哪一个?对什么安全?我不是苏你就是我的意思…哈哈
public class Together {
    private static ConcurrentMap<String, Collection<Family>> familyMap= new ConcurrentHashMap<String, Collection<Family>>();
    private static ConcurrentMap<String, ConcurrentMap<String, Collection<People>>> registry2 = new ConcurrentHashMap<String, ConcurrentMap<String, Collection<People>>>();

    static {
        registry2.put(Family.class.toString(), familyMap); 
    }
}
ConcurrentMap<String, Collection<? extends people>>
public class people {

    public class family extends people {

    }

    public static void main(String[] args) {
        together t = new together();
        System.out.println(together.registry);
    }

}
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class together {
    private static Collection<people.family> familyList = new ArrayList<people.family>();
    public static ConcurrentMap<String, Collection<? extends people>> registry = new ConcurrentHashMap<String, Collection<? extends people>>();

    static {
        registry.put(people.family.class.toString(), familyList);
    }

}