자바 제네릭 클래스 배열 리턴하는 함수의 표기 질문이요

조회수 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();
      }
      }
      

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)