최근 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에서 비슷한 함수를 작성했습니다:
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에서는 런타임 시 일반 유형 정보가 지워집니다. 즉, Targs에 다른 유형을 전달할 때 Java는 모든 인수가 동일한 유형인지 강제하지 않습니다. 단순히 입력을 객체로 처리합니다.
반면 TypeScript는 컴파일과 런타임 모두에서 엄격한 검사를 유지하여 모든 인수가 추론되거나 선언된 유형과 일치하는지 확인합니다.
이 경험을 통해 저는 고민하게 되었습니다. Java가 TypeScript처럼 더 엄격한 유형 검사를 시행해야 할까요? 아니면 이러한 유연성이 Java 설계의 의도적인 부분입니까?
어떻게 생각하세요? Java와 TypeScript 사이를 전환할 때 비슷한 문제를 겪은 적이 있나요? 댓글로 여러분의 생각을 듣고 싶습니다!
위 내용은 이것은 Java의 버그입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!