Моя ошибка:
groovy.lang.MissingMethodException: No signature of method: static test.getLittleEndianSize() is applicable for argument types: (ArrayList) values: [[-128, 0, 0, 0]]
Я строго использую байтовые массивы и никогда нигде не использую def / List, так что это меня действительно сбивает с толку. Есть идеи, почему это происходит? Насколько мне известно, groovy не переопределяет примитивы, такие как byte [], как реализацию List, и мне не удалось найти подобные ошибки.
Изначально это было ужасно для меня в большом проекте, и я упростил его до этого кода.
class test {
static class Packet {
byte[] data
Packet(String data) {
this.data = data.replaceAll(":", "").decodeHex()
}
int size() {
return data.size()
}
}
static class PacketList {
List<Packet> packets
long totalDataSize
PacketList(String data) {
packets = new ArrayList<Packet>()
totalDataSize = 0
addPacket(data)
}
void addPacket(String data) {
packets += new Packet(data)
totalDataSize += data.size()
}
long getLittleEndianSize() {
if (packets.size() <= 0)
return 0
// Verifying that we're for sure using byte[]
byte[] firstPacketBytes = packets[0].data
if (firstPacketBytes?.size() > 0) {
byte[] lilSizeBytes = Arrays.copyOfRange(firstPacketBytes, 0, 4)
return getLittleEndianSize(lilSizeBytes)
}
return 0
}
// No logic in place to decrement size yet
// No real need for this test
//
long getTotalDataSize() {
return totalDataSize
}
}
static long getLittleEndianSize(byte[] data) {
if (data?.size() < 4) return -1
long returnVal = 0
for (int i = 0; i < 4; i++) {
returnVal += ((long) data[i] & 0xffL) << (8 * i)
}
return returnVal
}
static void main(String[] args) {
String testByteStr = "80:00:00:00:ff:d8:11:12:13:14:15:d9:ff"
def packets = new PacketList(testByteStr)
println "${packets.getTotalDataSize()} bytes | Little Endian Header: ${packets.getLittleEndianSize()}"
}
}




отличный 2.4.11
упрощенный класс с проблемой:
public class A{
public static long fa(byte[]b){
return b.length;
}
static class B{
byte[] b = "123".getBytes();
long fb(){
return fa(b); // <<< line 9
}
}
public static void main(String [] arg){
System.out.println ( ">>>" + new B().fb() );
}
}
выдает исключение:
groovy.lang.MissingMethodException: No signature of method: static A.fa() is applicable
for argument types: (java.util.ArrayList) values: [[49, 50, 51]]
Possible solutions: fa([B), is(java.lang.Object), wait(), any(), find(), wait(long)
at A$B.fb(ConsoleScript49:9)
at A.main(ConsoleScript49:14)
кажется, Groovy не может найти статический метод из внешнего класса ...
вы видите (java.util.ArrayList) по ошибке, потому что groovy пытается найти разные варианты метода и, вероятно, это последняя попытка.
в java этот код успешно скомпилирован.
чтобы исправить это в Groovy, добавьте аннотацию @groovy.transform.CompileStatic во внешний класс или во внутренний класс или укажите точное местоположение метода:
return A.fa(b); // <<< line 9