Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将泛型0转换为java.lang.Short_Java_Generics_Map_Casting_Bounded Wildcard - Fatal编程技术网

无法将泛型0转换为java.lang.Short

无法将泛型0转换为java.lang.Short,java,generics,map,casting,bounded-wildcard,Java,Generics,Map,Casting,Bounded Wildcard,我的类中有两个映射(我是泛型新手) 我把它叫做 Integer a = getValue(aMap, 15); //okay in any case Short b = getValue(bMap, 15); //15 key does not exist 第二种情况是: ClassCastException: java.lang.Integer cannot be cast to java.lang.Short 所以我可能需要做一些类似于:新数字(0),但数字是抽象的 我如何修复它? 编辑

我的类中有两个映射(我是泛型新手)

我把它叫做

Integer a = getValue(aMap, 15); //okay in any case
Short b = getValue(bMap, 15); //15 key does not exist
第二种情况是:

ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
所以我可能需要做一些类似于
:新数字(0)
,但数字是抽象的

我如何修复它?

编辑:

我的想法是在没有附加ifs的情况下进行算术运算:

Integer a = getValue(aMap, 15);
a = a + 10;

嗯,如果不以代码可以看到的方式提供
t
,您就无法做很多事情

此时最简单的方法可能是保持0值的映射:

private static Map<Class<?>, Number> ZERO_VALUES = createZeroValues();

private static Map<Class<?>, Number> createZeroValues() {
    Map<Class<?>, Number> ret = new HashMap<Class<?>, Number>();
    ret.put(Integer.class, (int) 0);
    ret.put(Short.class, (short) 0);
    ret.put(Long.class, (long) 0);
    // etc
}

基本上这是Java泛型的一个限制:(

一种方法是将默认值作为参数提供给函数:

private <T extends Number> T getValue (Map<Integer, T> map, Integer key, T dflt) {
    return (T) ((map.containsKey(key)) ? map.get(key) : dflt);
}

public static void main(String[] args) {
    Integer a = getValue(aMap, 15, 0); //okay in any case
    Short b = getValue(bMap, 15, (short)0); //15 key does not exist
}
private T getValue(映射映射,整数键,T dflt){
return(T)((map.containsKey(key))?map.get(key):dflt);
}
公共静态void main(字符串[]args){
整数a=getValue(aMap,15,0);//在任何情况下都可以
Short b=getValue(bMap,15,(Short)0);//15键不存在
}

将0显式转换为short,因为默认情况下它将为int。然后转换为short wrapper。在java中,u无法直接从原语转换为其他类型的包装。

在这种情况下,我只需重写
get()
方法:

 private Map<Integer, Short> bMap = new HashMap<Integer, Short>() {
     @Override
     public Short get(Object key) {
         return containsKey(key) ? super.get(key) : new Short(0);
     }
 };
私有映射bMap=newhashmap(){ @凌驾 公共短获取(对象密钥){ return containsKey(key)?super.get(key):新的Short(0); } };
然后您可以在任何地方使用它,它将按照您指定的方式运行。

如果您返回null而不是零,则不会出现此问题。而且它可能更正确,因为零实际上是一个有效值(除非您说您的映射永远不会包含这些值)。感谢您的快速回答!但是NPE的解决方案似乎更简单。如果您正在考虑编写
(简短)0
getValue
方法中,这将适用于short和int,但不适用于double。然后,如前一篇文章中所述,您必须在map中使用不同的值。否则返回null。因为隐式转换不可能适用于OP所要求的,所以听起来似乎不需要适用于double?Thx:)我经常使用这种技巧。顺便说一句,你可以“不接受”答案,也可以接受其他答案:)顺便说一句,为什么是
super.get(key)
?它不应该是
get.key()?调用
get(key)
将是递归的-该方法将调用自身(因为您正在重写get方法)。调用
super.get(key)
调用
HashMap
的实现。记住匿名类是编码类的子类。“记住匿名类是编码类的子类。”我错过了,谢谢!
private <T extends Number> T getValue (Map<Integer, T> map, Integer key, Class<T> clazz) {
    return clazz.cast(map.containsKey(key) ? map.get(key) : ZERO_VALUES.get(clazz));
}
Short b = getValue(bMap, 15, Short.class);
private <T extends Number> T getValue (Map<Integer, T> map, Integer key, T dflt) {
    return (T) ((map.containsKey(key)) ? map.get(key) : dflt);
}

public static void main(String[] args) {
    Integer a = getValue(aMap, 15, 0); //okay in any case
    Short b = getValue(bMap, 15, (short)0); //15 key does not exist
}
 private Map<Integer, Short> bMap = new HashMap<Integer, Short>() {
     @Override
     public Short get(Object key) {
         return containsKey(key) ? super.get(key) : new Short(0);
     }
 };