相关疑难解决方法(0)

通用类型转换

我有以下类(简化但仍然是一个工作示例):

class Test<T> {
    List<T> l = new ArrayList<>();

    public Test() {
    }

    public void add(Object o) {
        l.add((T)o);
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试代码:

Test<Double> t = new Test<>();
t.add(1);
t.add(1.2);
t.add(-5.6e-2);
t.add("hello");
Run Code Online (Sandbox Code Playgroud)

一切都很好,这不是我所期待的.该add方法不应该扔一个ClassCastException?如果我添加一个get或多或少相同的方法:

    public T get(int i) {
        return l.get(i);
    }
.../...
t.get(1);             // OK.
t.get(3);             // OK (?)
Double d = t.get(3);  // throws ClassCastException
Run Code Online (Sandbox Code Playgroud)

为什么仅在变量赋值时抛出异常?如果强制转换(T)不起作用,我如何强制执行类型一致性?

java generics casting

19
推荐指数
3
解决办法
1万
查看次数

在Java中转换为泛型类型不会引发ClassCastException?

我遇到了一个奇怪的Java行为,看起来像个bug.是吗?将对象转换为泛型类型(例如K),ClassCastException即使对象不是实例,也不会抛出K.这是一个例子:

import java.util.*;
public final class Test {
  private static<K,V> void addToMap(Map<K,V> map, Object ... vals) {
    for(int i = 0; i < vals.length; i += 2)
      map.put((K)vals[i], (V)vals[i+1]); //Never throws ClassCastException!
  }
  public static void main(String[] args) {
    Map<String,Integer> m = new HashMap<String,Integer>();
    addToMap(m, "hello", "world"); //No exception
    System.out.println(m.get("hello")); //Prints "world", which is NOT an Integer!!
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:感谢cletus和Andrzej Doyle提供的有用答案.因为我只能接受一个,所以我接受了Andrzej Doyle的回答,因为它让我找到了一个我认为不太糟糕的解决方案.我认为这是在单行中初始化小地图的一种更好的方法.

  /**
   * Creates a map with given …
Run Code Online (Sandbox Code Playgroud)

java generics casting

10
推荐指数
2
解决办法
3175
查看次数

动态转换为Java中的泛型类型

这是我放在一起的一个小例子:

private static <T> T getValue(T defaultValue) {
    if (defaultValue instanceof Boolean) {
        return (T) true;
    }
    return defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

基本上,如果T是布尔类型,我希望返回"true".但是,我得到一个编译错误,布尔值不能强制转换为T.

我该怎么做?

还有,有办法检查T是否是boolean类型?问候.

java

2
推荐指数
2
解决办法
607
查看次数

标签 统计

java ×3

casting ×2

generics ×2