GetWindowRect的Groovy JNA实现抛出了java.lang.ClassCastException:[我无法强制转换为[Ljava.lang.Object;

时间:2017-03-08 17:50:54

标签: groovy jna

使用Groovy和JNA为Windows环境实现GetWindowRect()。代码来自Hovercraft Full Of Eels的回答here。唯一的区别是我使用的是Groovy而不是Java。

所以而不是

int[] rect = {0, 0, 0, 0};

我的代码有

int[] rect = [0, 0, 0, 0]

这会导致抛出ClassCastException异常。所以我尝试了以下初始化rect的方法:int []:

def rect = [0, 0, 0, 0] as int[]
def rect = (int[]) [0, 0, 0, 0]
def rect = [0, 0, 0, 0].toArray(new int[0])

但它们都没有解决铸造问题。我做错了什么?

这是堆栈跟踪:

java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object;

at com.sun.jna.Function.concatenateVarArgs(Function.java:763)
at com.sun.jna.Library$Handler.invoke(Library.java:207)
at com.sun.proxy.$Proxy21.GetWindowRect(Unknown Source)
at bnsf.create_trains.JNAWin32ApiInterface$JNAUser32$GetWindowRect$4.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
at bnsf.create_trains.WindowsApp.getRect(WindowsApp.groovy:178)
at bnsf.create_trains.WindowsApp$getRect$0.callStatic(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:191)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:211)
at bnsf.create_trains.WindowsApp.kickoff_mainframe(WindowsApp.groovy:94)
at bnsf.TestAutoMain.TestAutoMainMethod(TestAutoMain.java:60)

1 个答案:

答案 0 :(得分:0)

你发布的答案通常在groovysh为我工作,我试过

int[] rect = [0,0,0,0]
rect=[0,0,0,0]
rect=[0,0,0,0] as int[]

并且他们都工作了,但是你引用的例子使用了:

int[] rect = {0, 0, 0, 0};

这似乎在groovy中不起作用(老实说,我很惊讶它在java中有效,但确实如此,你每天都学到新东西)

我猜测不同之处在于groovy使用{}来封闭,并且有更好的方法来初始化数组,因此有一些形式的初始化它不允许以避免混淆。

您是否有可能使用旧版本的groovy或静态类型版本?