Clojure 将java.lang.Long传递给整数构造函数
据我所知,它与以下Java代码相同:Clojure 将java.lang.Long传递给整数构造函数,clojure,Clojure,据我所知,它与以下Java代码相同: (Integer. 1) 所以现在我有以下的结构 new Integer(1) 这是怎么回事?Java Integer类已获得,它们不接受Long 顺便说一下,以下方法不起作用: (Integer. (Long. 1)) #=> 1 这看起来确实像Clojure中的一个bug。对于Java,情况正好相反。这似乎与一个超过五年的“增强”请求有关。也许最好用这个小例子来解决这个问题 new Long(新整数(1))由于和的组合,应该是可以接受的 通
(Integer. 1)
所以现在我有以下的结构
new Integer(1)
这是怎么回事?Java Integer类已获得,它们不接受Long
顺便说一下,以下方法不起作用:
(Integer. (Long. 1))
#=> 1
这看起来确实像Clojure中的一个bug。对于Java,情况正好相反。这似乎与一个超过五年的“增强”请求有关。也许最好用这个小例子来解决这个问题
new Long(新整数(1))
由于和的组合,应该是可以接受的
通过取消装箱(与自动装箱相反),某些对象会隐式转换为基本类型:
将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为以下对象时,Java编译器将应用取消装箱:
- 作为参数传递给需要相应基元类型的值的方法
- 分配给相应基元类型的变量
Integer
对象隐式减少为int
,而Long
对象隐式减少为Long
通过加宽,可以在不丢失信息的情况下将基本类型隐式转换为“加宽”基本类型。这意味着
int
可以转换为long
,但不能转换为其他方式,因此应拒绝新整数(新长(1))
。确定。Java自动取消对整型/长型类型的装箱。没关系。但是加宽应该是int到long、float或double
,但不是我在示例中所做的(long->int
)等等,你是对的。这似乎与此相反。这确实有点奇怪。@fl00r有趣的是,当我在Java中尝试这一点时,javac
抱怨new Integer(new Long(1))
并接受new Long(new Integer(1))
,正如预期的那样。好的,我得到了这段Java代码,它将Long转换为int@fl00r,我对Clojure源代码不太熟悉,但是看到它如何抱怨clojure.lang.Reflector.invokeConstructor
,我认为问题在于类型逻辑,而不是clojure.lang.RT
中的转换函数。
(Long. (Integer. 1))