>  기사  >  Java  >  이것은 Java의 버그입니까?

이것은 Java의 버그입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-11 10:18:02547검색

Is this a bug in Java?

최근 Java에서 console.log의 유연성을 다시 만들고 싶었기 때문에 다음과 같이 여러 인수를 허용하고 쉼표로 구분하여 인쇄할 수 있는 일반 인쇄 함수를 작성하기로 결정했습니다. JavaScript 또는 TypeScript의 console.log. 결과는? 답변보다 더 많은 질문이 남았습니다. 자세히 안내해 드리겠습니다.

자바 코드

저는 T 유형의 가변 인수를 가져와 인쇄하고 값을 쉼표로 구분하는 간단한 일반 함수를 Java로 작성하는 것부터 시작했습니다.

public class Main {
    public static void main(String[] args) {
        Main.print(1, "4", new ArrayList<>());
        // Expected type issues, but it ran without any problem!
    }

    private static <T> void print(T... args) {
        System.out.println(Arrays.toString(args));
    }
}

Integer, String, ArrayList와 같은 혼합 유형을 전달하면 Java의 엄격한 유형 지정으로 인해 경고를 받거나 오류가 발생할 것으로 예상했지만 그렇지 않았습니다. 코드는 아무런 불만 없이 [1, 4, []]를 인쇄하면서 정상적으로 컴파일되고 실행되었습니다.

TypeScript를 사용하는 사람으로서 이것이 기분이 좋았기 때문에 놀랐습니다. Java가 이러한 유형의 불일치를 잡아내면 안 되나요?

TypeScript에서 시도해 보기

저는 당연히 이 문제를 어떻게 처리할지 알아보기 위해 TypeScript를 선택했습니다. TypeScript에서 비슷한 함수를 작성했습니다:

function print<T>(...args: T[]) {
  console.log(args.join(","));
}

print(1, "4", []);
// TS warns (which makes sense):
// Argument of type 'string' is not assignable to parameter of type 'number'.

예상대로 TypeScript에서 경고가 표시되었습니다! TypeScript는 첫 번째 인수(1)에서 T 유형을 숫자로 추론했기 때문에 두 번째 및 세 번째 인수("4" 및 [])를 유효하지 않은 것으로 표시했습니다. TypeScript는 일반 함수에 대해 일관된 유형을 적용하기 때문에 이 동작은 완벽하게 이해되었습니다.

그렇다면 이것은 Java의 버그입니까?

꼭 그렇지는 않습니다. 여기서 일어나는 일은 유형 삭제로 인해 Java의 유형 시스템이 다르게 동작한다는 것입니다. Java에서는 런타임 시 일반 유형 정보가 지워집니다. 즉, Targs에 다른 유형을 전달할 때 Java는 모든 인수가 동일한 유형인지 강제하지 않습니다. 단순히 입력을 객체로 처리합니다.

반면 TypeScript는 컴파일과 런타임 모두에서 엄격한 검사를 유지하여 모든 인수가 추론되거나 선언된 유형과 일치하는지 확인합니다.

결론

이 경험을 통해 저는 고민하게 되었습니다. Java가 TypeScript처럼 더 엄격한 유형 검사를 시행해야 할까요? 아니면 이러한 유연성이 Java 설계의 의도적인 부분입니까?

어떻게 생각하세요? Java와 TypeScript 사이를 전환할 때 비슷한 문제를 겪은 적이 있나요? 댓글로 여러분의 생각을 듣고 싶습니다!

위 내용은 이것은 Java의 버그입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.