Байтовый массив Groovy неявно приводится к ArrayList

Моя ошибка:

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()}"
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
480
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

отличный 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

Другие вопросы по теме