2014-11-24 4 views
1

어쩌면 이전에 답변을 받았을 수도 있지만 여기에서 찾지 못했습니다. 다음 코드 줄을 고려일반적인 유형의 메소드 가져 오기

public static <T> T getAs() { ... } 

반사에 의해, 객체 Class<T>를 얻을 수있다? 대한 명확한

는, 메신저 정말 편리에

class Foo<T> { 
    public T get() { ...} 
} 

이것은 다음과 같이 사용 예

class Foo { 
    private List<A> items; 

    public <T extends A> T first() { 
     Class<T> clazz = //Magic?? 
     foreach (A a : items) { 
      if (clazz.isInstance(a)) return (T)a; 
     } 
     return null; 
    } 

} 

를 들어, C#에서 수행 할 수 있습니다에서 같은 클래스의 일반적인 유형을 찾고 있지 :

SubClass s = fooInst.<SubClass>first(); 
+0

물가로 갔습니까? http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? – reto

+0

https://docs.oracle.com/javase/tutorial/reflect/member/methodType.html –

+0

나는 이것이 중복이라고 생각하지 않습니다. 나는 그녀가 정말로 클래스 을 원하고 있다고 생각합니다. 현재 클래스 –

답변

0

때때로, 심지어는 컴파일 후 일반적인 유형 정보를 잡아 참으로 가능하다. 이론적으로 이것은 일반 메소드 호출에서도 가능합니다. 겁탈 자, 이건 나쁜 생각이야. 학문적 인 이유 때문에 가능한 방법을 고려해 보겠습니다.

  1. 메소드 내에서 실행 스택을 확인하십시오.
  2. 호출 클래스를 추출하십시오.
  3. 호출 클래스의 클래스 파일을 찾아 해석하고 호출 메소드의 바이트 코드를 구문 분석합니다.
  4. 메서드가 호출되는 줄을 찾습니다.
  5. 에뮬레이션 javac의의의 타입 추론 메커니즘과는 T javac의 것을이 infered 것이다 동일한 유형을 찾습니다.
  6. T에 대해 찾은 이름으로 클래스를로드하십시오.

이것은 물론 잘 작동하지 않으며 T의 형식이 소스 코드에 명시 적으로 지정되면 깨질 수 있습니다. 그리고 메소드 호출이 갑자기 IO를 요구할 때 이것을 수행하기를 원하지 않을 것입니다. 당신은 필수 종류 당신을 공급하기 위해 사용자를 필요로하지만, 형태 보증 된 방법으로 그것을 할,

<T> T getAs(Class<? extends T> type) { ... } 

이 경우 :

은 당신이 아마 원하는 것은 반환하는 것입니다.

관련 문제