当参数由泛型方法返回时,java 11 jvm 没有选择正确的方法

问题描述

我的项目在切换到 Java 11 时遇到了问题。问题是: 我有一个界面

public interface InterfaceA {}

一个子类

public class ClassA implements InterfaceA {}

和泛型方法

private final Map<String,InterfaceA> h = new HashMap<>();
public <T extends InterfaceA> T get(String key) {
  return (T) h.get(key);
}

现在当我调用一个 StringBuilder 追加方法时:

StringBuilder sb=new StringBuilder();
sb.append(get("KeyString")); //call StringBuilder.append(CharSequence) method

我在运行时收到 ClassCastException

Exception in thread "main" java.lang.classCastException: class ClassA cannot be cast to class java.lang.CharSequence

当我转换返回值时

sb.append((ClassA)get("KeyString")); //call StringBuilder.append(Object) method

有效!

问题是为什么选择jvm的方法不对?

StringBuilder.append(CharSequence);

代替

StringBuilder.append(Object);

我不想实现 CharSequence 接口。早期它适用于 java 8。现在我不想在我的代码中强制转换每个调用,因为整个代码中有 1000 多个位置。

HashMap.put 方法也有同样的问题。

感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)