development

제네릭 유형 매개 변수에서`.class` 속성을 얻으려면 어떻게해야합니까?

big-blog 2020. 12. 5. 10:08
반응형

제네릭 유형 매개 변수에서`.class` 속성을 얻으려면 어떻게해야합니까?


이 질문에 대한 대답 TGeneric<T>클래스 에서의 인스턴스를 만드는 방법을 설명합니다 . 여기에는 Class<T>매개 변수를 Generic생성자에 전달하고 newInstance그로부터 메소드를 호출하는 것이 포함됩니다 .

Generic<Bar>그런 다음 의 새 인스턴스 가 생성되고 매개 변수 Bar.class가 전달됩니다.

Generic클래스 의 제네릭 유형 매개 변수 가 알려진 클래스가 Bar아니라 그 자체가 제네릭 유형 매개 변수 인 경우 어떻게합니까? 다른 클래스 가 있고 해당 클래스 내부에서 Skeet<J>의 새 인스턴스를 만들고 싶다고 가정 Generic<J>합니다. 그런 다음 전달하려고 J.class하면 다음 컴파일러 오류가 발생합니다.

cannot select from a type variable.

이 문제를 해결할 방법이 있습니까?

나를 위해 오류를 유발하는 특정 코드는 다음과 같습니다.

public class InputField<W extends Component & WidgetInterface>
                                                 extends InputFieldArray<W>
{
  public InputField(String labelText)
  {
    super(new String[] {labelText}, W.class);
  }
  /* ... */
}

public class InputFieldArray<W extends Component & WidgetInterface>
                                                                 extends JPanel
{
   /* ... */
  public InputFieldArray(String[] labelText, Class<W> clazz)
                          throws InstantiationException, IllegalAccessException
  {
    /* ... */

    for (int i = 0 ; i < labelText.length ; i++) {
      newLabel = new JLabel(labelText[i]);
      newWidget = clazz.newInstance();
      /* ... */
    }
    /* ... */
  }
  /* ... */
}

쓸 수 없기 때문에 오류가 발생합니다 W.class. 동일한 정보를 전달하는 다른 방법이 있습니까?


사용 .class유형 매개 변수에 허용되지 않습니다 - 때문에의 유형 삭제 , W한 것입니다 삭제Component런타임에. InputField다음 Class<W>과 같이 발신자로부터 도 가져와야합니다 InputFieldArray.

public InputField(String labelText, Class<W> clazz)
{
    super(new String[] {labelText}, clazz);
}

유형 삭제로 인해 W를 사용하지 못할 수 있습니다. Class<W>메소드에 a 가 전달되도록 요구해야합니다 . 클래스 객체를 얻고 그 제네릭은 W공분산으로 인해 하위 클래스 전달되지 않도록합니다 .

public InputField(String labelText, Class<W> cls)
{
    super(new String[] {labelText}, cls);
}

걸릴 수 W.class있지만 WSubtype.class.


GSON라이브러리를 사용하는 경우을 T사용하여 쉽게 유형을 얻을 수 있습니다 TypeToken. 클래스 문서는 여기에서 사용할 수 있습니다 .

나는 이렇게했다 :

이것은 내 클래스 정의입니다.

public class ManagerGeneric <T> {}

이것은 내 방법입니다.

// Get the type of generic parameter
Type typeOfT = new TypeToken<T>(){}.getType();
// Deserialize
T data = gson.fromJson(json, typeOfT);

참고 URL : https://stackoverflow.com/questions/18255117/how-do-i-get-the-class-attribute-from-a-generic-type-parameter

반응형