자바 제네릭 클래스 배열 리턴하는 함수의 표기 질문이요
조회수 1220회
https://d2.naver.com/helloworld/1219
이 게시글을 읽고 있는데 중간에
class ValueHolder<T>{ //generic class
private T value;
public ValueHolder(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class ImprovedGenericEx2{
public static <T> ValueHolder<T>[] doBadThing(ValueHolder<T>... values) { //Varargs
// public static <String> ValueHolder<String>[] doBadThing(ValueHolder<String>... values)
Object[] objs = values;
objs[0] = new ValueHolder<Integer>(10);
return values;
}
public static void main(String[] args) {
ValueHolder<String>[] result = doBadThing(new ValueHolder<String>("foo"), new ValueHolder<String>("bar"));
for (ValueHolder<String> holder : result) {
String value = holder.getValue(); // ClassCastException 발생
System.out.println(value);
}
}
}
여기서
public static <T> ValueHolder<T>[] doBadThing(ValueHolder<T>... values)
<T>
는 왜 필요한가요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
제네릭 메소드라고 합니다.
매개 타입과 리턴 타입의 타입 파라미터를 갖는 메소드입니다. 제거하면 문법오류이므로 컴파일이 되지 않습니다.
public static <T> MyClass<T> createMyClass(T t) { MyClass<T> myClass= new MyClass<T>(); ... return myClass; }
예제를 검색해보니 아래와 같은 예제가 나오네요.
public class Box<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } }
public class Util { public static <T> Box<T> boxing(T t) { Box<T> box = new Box<T>(); box.setT(t); return box; } }
public class Main { public static void main(String[] args) { Box<Integer> box1 = Util.<Integer>boxing(100); // 여기 타입을 보세요. boxing 메소드의 제네릭타입이 Integer 입니다. int intValue = box1.getT(); Box<String> box2 = Util.<String>boxing("ABC"); // 제너릭 타입이 String String strValue = box2.getT(); } }
댓글 입력