2015-01-21 2 views
2

문자열에서 객체를 생성하고 싶습니다. 생성 된 객체가 IObject를 확장하는 IObjectImpl 유형이되도록하고 싶습니다.Intellij에서 이상한 오류가 발생했습니다. Java Generics issue

그래서 문자열과 인터페이스 클래스 (IObject를 확장하는 IObjectImpl.class는 필수 항목 임)를 사용하는 팩토리 클래스 메서드가 있습니다. 이 메서드는 문자열에서 생성 된 객체 (리플렉션 사용) 유형이 IObject인지 자동으로 감지하여 IObjectImpl로 캐스팅합니다.

나는 테스트를 위해 다음 코드를 작성했다. 그러나 Intellij는 오류를 표시하지 않고 동시에 main 메서드를 실행하는 동안 끝에 오류가 표시됩니다.

public <T extends IObject, E extends T> E getInstanceOfType(String clazz, Class type) { 
    try { 
     System.out.println("Type got is " + type); 
     return null; 
    } catch (Exception exception) { 
     throw new ObjectInstantiationException(String.format("Could not create the " 
       + "instance of type %s", clazz), exception); 
    } 
} 

public static void main(String[] args) { 
    new Factory().getInstanceOfType("Some class", IObjectImpl.class); 
} 

오류 :

Error:(67, 49) java: ..path\Factory.java:67: incompatible types; inferred type argument(s) com.myCompany.IObject,java.lang.Object do not conform to bounds of type variable(s) T,E 
found : <T,E>E 
required: java.lang.Object 

는 지금까지 유형을 확인하는 등, 난 그냥 eClass.isAssignableFrom (인 TClass) 접근 방식에 대해 알고.

마지막 목표는 캐스팅없이 IObjectImpl에 정의 된 메서드를 호출 할 수 있어야한다는 것입니다. Java 1.6을 사용하여 어떻게 할 수 있습니까?

+0

어쩌면이 일부 도움이 될 수 있습니다 http://stackoverflow.com/questions/21893223/java-generic-issue -incompatible-types-inferred-type-arguments-java-lang-obj – Stultuske

+0

아마도'Class'에 대한 제네릭 바인딩을 잊어 버렸을까요? 그리고 아마도 원시 타입에 대한 경고를 받고 있습니까? – chrylis

답변

2

당신은 다음과 같은 유형을 지정할 수 있습니다 (자바 6)

public static void main(String[] args) { 
    new Factory().<IObject, IObjectImpl> getInstanceOfType("Some class", IObjectImpl.class); 
} 
+0

그것은 독립적으로 작동합니다. 같은 공장을 콩처럼 연결하고 봄을 사용하여 다른 곳으로 갈 수 있습니까? – phoenix

+0

고맙습니다. 클래스 과 같은 클래스에 제네릭을 제공하면 아무런 문제가 없습니다. 나는 봄이 또한 연결될 수 있다고 생각한다. – phoenix

+0

걱정할 필요가 없습니다. 봄에 행운을 빈다. 좋은 프레임 워크이다. :) – vikingsteve

3
public class Factory { 
    public <T extends IObject, E extends T> E getInstanceOfType(String clazz, Class<E> type) { 
     try { 
      System.out.println("Type got is " + type); 
      return null; 
     } catch (Exception exception) { 
      throw new RuntimeException(String.format("Could not create the " 
        + "instance of type %s", clazz), exception); 
     } 
    } 

    public static void main(String[] args) { 
     new Factory().<IObject, IObjectImpl>getInstanceOfType("Some class", IObjectImpl.class); 
    } 
} 
+0

6 분 전에 게시 된 응답의 멋진 사본 :) – vikingsteve

+3

내 IDE를 실행하려면 6 분이 필요합니다. 죄송합니다. – Vitaly

+0

걱정할 필요가 없습니다. 미래를 위해서 - 페이지 상단을보십시오. "이 질문에 대한 새로운 답변이 게시되었습니다"라고 표시되면 자신의 답변을 게시하기 전에 클릭하여 새로 고침하십시오. 이것은 중복을 피하는 데 도움이됩니다 :) – vikingsteve

관련 문제