main 메서드에 String[] args도 어떤 의미가 있겠지 싶었는데 이것이 가변 인자라는게 새삼 놀라웠습니다.
작성해주신 글을 읽어보며 마지막 코드의 getClass() 값이 독특하게 나오는 점이 흥미로워서 저도 몇가지 테스트를 해보았습니다.
출력되는 클래스 타입에 대해서는 해당 가변 인자들을 포함할 수 있는 가장 작은 타입 정도로만 보였는데 이에 대해 유의미한 자료를 찾지는 못했습니다. 다만 몇 번의 테스트를 통해 Serializable 타입 배열에 들어갈 수 있는 값들은 class [Ljava.io.Serializable; 로 출력되는 것으로 보였고(더 작은 공통 타입이 있으면 그것으로 나옴) Serializable 인터페이스를 구현한 ArrayList와 Stack 타입의 경우 잘 출력되는 것을 볼 수 있었습니다. List.of(2)의 경우 타입이 List인데 이는 Serializable 인터페이스를 구현하지 않고 있어서 Object가 출력되는 것으로 보였으며, ArrayList 타입으로 선언한 list를 List 타입으로 바꿀 경우 Serializable로 타입 캐스팅을 요구했습니다.
public class Main {
public static void main(String[] args) {
toArray("A", 1, List.of(2));
toArray("A", 1, (Serializable) List.of(2));
Serializable[] arr = new Serializable[3];
arr[0] = "A";
arr[1] = 1;
ArrayList<Double> list = new ArrayList<>();
list.add(3.14);
arr[2] = list;
toArray(arr[0], arr[1], arr[2]);
Stack<Double> st = new Stack<>();
st.push(2.71);
arr[2] = st;
toArray(arr[0], arr[1], arr[2]);
}
static <T> T[] toArray(T... arguments) {
System.out.println(arguments.getClass());
return arguments;
}
}
//////////
class [Ljava.lang.Object;
class [Ljava.io.Serializable;
class [Ljava.io.Serializable;
class [Ljava.io.Serializable;
Based on : chapter_05/item32_손영준_제네릭과-가변-인자에-대한-심화-탐구.md by @Glenn-syj
main 메서드에 String[] args도 어떤 의미가 있겠지 싶었는데 이것이 가변 인자라는게 새삼 놀라웠습니다. 작성해주신 글을 읽어보며 마지막 코드의 getClass() 값이 독특하게 나오는 점이 흥미로워서 저도 몇가지 테스트를 해보았습니다.
출력되는 클래스 타입에 대해서는 해당 가변 인자들을 포함할 수 있는 가장 작은 타입 정도로만 보였는데 이에 대해 유의미한 자료를 찾지는 못했습니다. 다만 몇 번의 테스트를 통해 Serializable 타입 배열에 들어갈 수 있는 값들은
class [Ljava.io.Serializable;
로 출력되는 것으로 보였고(더 작은 공통 타입이 있으면 그것으로 나옴) Serializable 인터페이스를 구현한 ArrayList와 Stack 타입의 경우 잘 출력되는 것을 볼 수 있었습니다. List.of(2)의 경우 타입이 List인데 이는 Serializable 인터페이스를 구현하지 않고 있어서 Object가 출력되는 것으로 보였으며, ArrayList 타입으로 선언한 list를 List 타입으로 바꿀 경우 Serializable로 타입 캐스팅을 요구했습니다.