Grails 三元算子的奇异行为

Grails 三元算子的奇异行为,grails,groovy,Grails,Groovy,我观察到奇怪的行为,在干净的“测试”应用程序中,我有一个简单的控制器: (Grails2.5.0、Java Oracle 8u45、GNU/Linux Debian 7) 包测试 类控制器{ def ok(){ 双d=0d int i=(int)d def r=[] r我认为这是因为Groovy试图为不兼容的类型找到一个共同点。这是各种三元运算符使用的一个示例: println ((true ? (0 as Integer) : (0.0 as Float)).class) println ((

我观察到奇怪的行为,在干净的“测试”应用程序中,我有一个简单的控制器:

(Grails2.5.0、Java Oracle 8u45、GNU/Linux Debian 7)

包测试
类控制器{
def ok(){
双d=0d
int i=(int)d
def r=[]

r我认为这是因为Groovy试图为不兼容的类型找到一个共同点。这是各种三元运算符使用的一个示例:

println ((true ? (0 as Integer) : (0.0 as Float)).class)
println ((true ? (0 as Float) : (0.0 as Double)).class)
println ((true ? (0 as Integer) : (0 as Long)).class)
println ((true ? (0 as Integer) : (0 as Byte)).class)
Groovy就是这样将其编译成Java的

var1[1].callCurrent(this, var1[2].callGetProperty(true?(Float)ScriptBytecodeAdapter.castToType((Integer)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Integer.class), Float.class):(Float)ScriptBytecodeAdapter.asType($const$0, Float.class)));
var1[3].callCurrent(this, var1[4].callGetProperty(true?(Double)ScriptBytecodeAdapter.castToType((Float)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Float.class), Double.class):(Double)ScriptBytecodeAdapter.asType($const$0, Double.class)));
var1[5].callCurrent(this, var1[6].callGetProperty(true?(Long)ScriptBytecodeAdapter.castToType((Integer)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Integer.class), Long.class):(Long)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Long.class)));
var1[7].callCurrent(this, var1[8].callGetProperty(true?(Integer)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Integer.class):(Integer)ScriptBytecodeAdapter.castToType((Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class), Integer.class)));
在所有情况下,它都会进行大量类型转换,只是为了使真/假结果分支一致,并使它们返回相同的类型。令人惊讶的是,只有数值才是这种情况。其他值的处理方式不同

println ((true ? ("s") : (0 as Byte)).class)
println ((false ? ("s") : (0 as Byte)).class)
println ((true ? (new Date()) : (0 as Byte)).class)
被翻译成类似Java的语言

var1[9].callCurrent(this, var1[10].callGetProperty(true?"s":(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));
var1[11].callCurrent(this, var1[12].callGetProperty(false?"s":(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));
var1[13].callCurrent(this, var1[14].callGetProperty(true?var1[15].callConstructor(Date.class):(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));

它没有回答为什么会这样,而是回答了为什么会这样。至少我希望是这样。

你能添加一张罚单/url/…作为参考,在哪里声明“不是一个bug”?添加了问题I get的链接
[0,0.0,0.0]
在带有Groovy 2.3.4 Java的Groovy shell中8u45@doelleri谢谢,我意识到我在系统中使用了groovyConsole,这有点过时(Groovy 1.8.6),2.4.3返回
[0,0.0,0.0]
。Groovy肯定是这样(显然行为已经改变了)。我可以问一下您使用了什么反编译器吗?因为Java非常离谱谢谢!在Groovy中,数字类型到“更宽”类型的转换对我来说非常常见,所以我不再觉得这很奇怪了(…在意识到我使用旧的Groovy进行“脱离grails”的测试之后)。
var1[9].callCurrent(this, var1[10].callGetProperty(true?"s":(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));
var1[11].callCurrent(this, var1[12].callGetProperty(false?"s":(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));
var1[13].callCurrent(this, var1[14].callGetProperty(true?var1[15].callConstructor(Date.class):(Byte)ScriptBytecodeAdapter.asType(Integer.valueOf(0), Byte.class)));