【问题标题】:ClassCastException String to MValue, java 8 [duplicate]ClassCastException字符串到MValue,java 8 [重复]
【发布时间】:2015-11-19 11:15:50
【问题描述】:

我有一个界面

public interface MValue extends SomeOtherInterface, Serializable

我在另一个界面中使用它

    public interface DomainObject extends Iterable<FieldValueAssociation>, Cloneable, Serializable {
     void add(DomainField field, MValue... values);
<T> T get(DomainField field);
    }

当我在我设置的其他类中调用它时

subDomain.add(DomainField.ZIP, d.get(DomainField.ZIP));

在 java 7 上这工作正常,但在 java 8 上我得到 java.lang.ClassCastException: java.lang.String cannot be cast to net.blabla.domain.MValue

d.get(DomainField.ZIP)应该返回String,是的,但是不能转换成MValue,不知道为什么?有人可以解释或让我参考一些文档。谢谢。

【问题讨论】:

  • 你能展示一个完整的、可编译的(在 Java 7 中)示例吗?
  • @assylias 代码在 Java 7 中完全一样,它也在 Java 8 中编译,我在运行时得到这个,这是一个巨大的 Spring 应用程序,这些类太大了,无法将它们粘贴到这里,那就是为什么我把它总结在这一点上。
  • 如果d.get(DomainField.ZIP 返回一个字符串,我看不出你的代码将如何编译,无论是使用Java 7 还是Java 8。这就是为什么我建议你尝试创建一个mcve 来帮助我们理解什么正在发生。您不需要粘贴所有这些类,只需一个显示问题的最小示例即可。
  • 您应该修复签名被设计破坏的方法&lt;T&gt; T get(DomainField field)。它声称能够返回调用者希望的任何类型,这显然是行不通的。

标签: java generics java-8 java-7 classcastexception


【解决方案1】:

那行得通吗?

subDomain.add(DomainField.ZIP, d.<String>get(DomainField.ZIP));

在这里,我将T 的类型明确指定为String,尽管如此,类型检查仍会发生,但编译器会清楚地知道预期的内容。 这个调用应该适用于 Java 7 和 8。

【讨论】:

  • 非常感谢先生,我用 d.get(DomainField.ZIP).toString() 修复了它,它给出的结果与您的答案相同。还要感谢@assylias 对我的问题感兴趣。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 2017-02-18
  • 2021-02-07
  • 2018-04-03
  • 2021-05-14
  • 2018-08-15
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多