openlang

Groovy에서 Java encode()에 null을 넘기면 ambiguous method인데, Java 쪽은 문제없어요

CSV export 루프를 Java에서 Groovy로 옮겼는데, 이제 nickname이 없는 row에서 작업이 죽어요. Java FieldEncoder에는 encode 오버로드가 세 개(String, Number, Collection) 있고, null은 토큰 NULL로 바뀌어야 해요. 예전 Java 코드에서는 encoder.encode(user.getNickname())가 null이어도 잘 동작했어요.

Groovy 쪽 코드예요:

def cells = COLUMNS.collect { col -> encoder.encode(row[col]) }

3번째 row에는 nickname 키가 없어요. 에러 첫 줄에 ambiguous method overloading이라고 나오고, 인자 목록은 [null]이에요. row[col]을 찍어 보면 null이라고 나와서 map은 정상으로 보여요. nullToken도 바꿔 봤는데 달라진 게 없어요.

Groovy 4.0.22가 없는 키에 대해 이상한 걸 반환하는 건가요, 아니면 null token 옵션을 지원하지 않는 건가요? 왜 Java는 여기서 null을 처리하는데 Groovy는 못 하는 거예요?

도와주시면 감사하겠습니다.

영어에서 번역원문 보기

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    Java는 정적 타입(여기서는 String)을 보고 컴파일 시점에 오버로드를 골라서 null이어도 괜찮아요. Groovy는 런타임에 dispatch하는데, 그냥 null은 String, Number, Collection에 똑같이 맞아요. 캐스팅하세요: encoder.encode((String) row[col]). 아니면 encode(Object) 오버로드를 추가하세요.

    영어에서 번역원문 보기
  2. 고유 링크

    imke 말이 맞아요. Groovy가 이상한 걸 반환하는 게 아니라, 런타임에서 null은 그냥 null이에요. 캐스팅하거나 row[col] as String을 쓰세요. Gradle 스크립트에서 제 Java helper를 호출할 때 똑같은 일을 겪었어요. 짜증나요. 저라면 encode(Object)를 추가하고 거기서 null을 처리해서 호출하는 쪽 코드를 깔끔하게 둘 거예요.

    encoder.encode(row[col] as String)
    영어에서 번역원문 보기
  3. 고유 링크

    두 분 다 고마워요, 캐스팅하니까 되네요. 그런데 Number 컬럼에 as String을 쓰면 값이 텍스트로 변환되나요?

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 읽기 전용 List<Int>는 스냅샷인가요?

    List<Int>는 읽기 전용 뷰예요. 스냅숏이 아니에요. 그 참조로 어떤 연산을 호출할 수 있는지 알려 줄 뿐, 뒤에 있는 컬렉션이 그대로 남는다고 약속하지는 않아요. val owned = mutableListOf(2, 4…

    답글 4최근 활동 kotlin
  2. private union case, smart constructor를 썼는데 remove 후에도 `Colors []`가 나와요?

    안녕하세요 여러분, 저는 작은 swatch 에디터를 만들고 있는데, 세 가지 case로 된 palette union이 있어요. 새로 편집을 시작하면 NotEntered, 의도적으로 비운 경우는 Empty, 그리고 Colors…

    답글 1최근 활동 fsharphaskell
  3. 측정 단위를 값싼 ID로 쓰기

    정수 ID에 단일 케이스 유니온 대신 측정 단위를 써 보고 있는데, 더 퍼지기 전에 다른 의견을 듣고 싶어요. CustomerId of int는 [<Struct>]를 붙이지 않으면 할당이 생기고, 쓸 때마다 생성자나 매치를…

    답글 1최근 활동 fsharp