gpt4 book ai didi

java - 未能在 java 泛型上强制类型

转载 作者:行者123 更新时间:2023-11-30 04:52:19 24 4
gpt4 key购买 nike

我完全被难住了,把它摆给大家看,看看你们是否知道发生了什么。

这是数据结构

Map<String, Object> objectMap

它目前存储字符串和数值,但将来可能存储更多类型。

这是我用来检索这些值的函数:

public <T> T get(String variable, T defaultValue) {
// returns either the object from the map, or the default if its not in the map.
Object value = getObject(variable, defaultValue);
logger.debug("default value is of type " + defaultValue.getClass().getName());

// Attempt to get around casting issue
if (value instanceof Number)
{
value = (Number) value;
}
T ret = (T) value;
logger.debug("Variable " + variable + " which is of type " + value.getClass().getName() + " and returning as " + ret.getClass().getName() + " (is number: " + (value instanceof Number) + ")");

return ret;
}

这是调用代码:

public int getFoo() { return this.<Integer>get("foo", 0); }

这是我在日志中看到的输出:

default value is of type java.lang.Integer
Variable foo which is of type java.lang.Long and returning as java.lang.Long (is number: true)

就在失败之前:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

这里最让我担心的是,尽管试图强制类使用 Integer,但类类型似乎是 Long

我是否遗漏了什么,或者违反了 Java 泛型的某些概念?

感谢您的帮助

最佳答案

getObject 方法返回的值是 java.lang.Long - 日志告诉您这一点。

泛型并不是魔法,它们不会在类型之间进行转换,它们只是编译器将其转回类型转换的语法糖。所以你的方法:

public <T> T get(String variable, T defaultValue)

确实是:

public Object get(String variable, Object defaultValue)

当调用 get 方法时:

this.<Integer>get("foo", 0)

这确实是:

(Integer)this.get("foo", 0)

因此会出现 ClassCastException,因为返回的 ObjectLong,而不是 Integer

如果不确切知道您要实现的目标,则很难给出具体建议,但通常您的 Map 应该使用您期望处理的通用类型。在您的情况下,这听起来像IntegerNumber。如果您确实想要任何 Number 的 int 值(我对此表示怀疑,因为当它大于 int 时该值将被截断),那么您应该使用 Number.intValue() 方法。

关于java - 未能在 java 泛型上强制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9563420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com