2014-03-12 2 views
0

다음 클래스/인터페이스 설정이 있습니다. IFoobar를 구현하고 BaseClass로 메서드의 매개 변수로 java.lang.Class 사용 문제

I을 확장 BaseClass로

  • 클래스 ConcreteClassC를 확장 BaseClass로
  • 클래스 ConcreteClassB를 확장
  • 클래스 ConcreteClassA 추상적 인

    • 인터페이스 IFoobar
    • 클래스 BaseClass로 위의 콘크리트에 java.lang.Class의 인스턴스를 전달해야하는 메소드가있다. 수업. 나는 그렇게 선언하고있다. 내가 컴파일 할 때

      void doSomething(String id, Class<IFoobar> c) 
      

      그러나, 자바는 다음과 같이 다소 오류가 불평 : 나는 최근에 일을 java.lang.Class의를 사용하는 데 필요한 한

      doSomething(java.lang.String,java.lang.Class<IFoobar>) in javaclass cannot be applied to 
           (java.lang.String,java.lang.Class<ConcreteClassA>) 
           register("12345", ConcreteClassA.class); 
           ^
      1 error 
      

      , 그래서 나는 뭔가를 놓치고 있다고 생각합니다. 나는 구체적인 클래스가 인터페이스의 인스턴스로 인식된다는 점에서 typed 클래스 선언이 정상적인 매개 변수처럼 작동 할 것으로 예상 했었지만, 분명히 그렇지 않습니다.

      저는 여러 가지 캐스팅 방법을 시도해 봤지만 원하는 결과가 없거나 유효하지 않은 코드가있었습니다. 그래서 내가해야 할 일에 대한 어떤 생각이라도 감사 할 것입니다.

      미리 감사드립니다.

  • +0

    가 어떻게 "클래스"의 인스턴스를 얻을 수 있습니다 사용할 수 있습니까? 어떤 수업의 객체를 전달하려고한다는 뜻입니까? –

    답변

    2

    유형 Class<IFoobar>의 변수를 사용해야합니다.

    변경 Class<IFoobar>에서 Class<? extends IFoobar>으로 변경하십시오.

    이 동작은 Class 개체에서 특히 유용하지 않습니다. 당신이이 일을 중지하는 곳은, 콜렉션들에 대해 훨씬 더 논리적이다 :

    void method1(List<IFoobar> list) 
    { 
        list.add(new ConcreteClassA()); 
    } 
    
    void method2() 
    { 
        List<ConcreteClassB> list = /* something */; 
        method1(list); 
        // oops! we put a ConcreteClassA inside a List<ConcreteClassB> 
    } 
    
    +0

    감사합니다 @immibis, 문제가 해결 된 것 같습니다. 나는 제네릭에 대한 전문가는 결코 아니지만, 'IFoobar를 확장 (또는이 경우 구현 한) 어떤 클래스가 맞습니까? – user3404036

    +0

    예. generics의 목적을 위해,'implements'와'extends'는 둘 다'extends' -'Class '가 잘못되었습니다. 제가 말했듯이, 제네릭은'Class'가 사용하는 방식보다는 컬렉션 라이브러리가 사용하는 방식을 생각할 때 훨씬 논리적입니다. 'List '또는'List '을 확장하지만'Class '을 사용하는 것이 실제로 좋은 이유는 아닙니다. IFoobar>'를 확장합니다. – immibis

    0

    Class<IFoobar>에 대해 허용되는 값은 IFooBar.class입니다. 당신이 IFooBar.class와 모든 서브 클래스를 수락 할 경우에만 Class<IFoobar> 객체가 아닌 Class<ConcreteClassA> 개체에 대한 참조를 보유 할 수 Class<? extends IFooBar>

    0

    오류는 당신이 오류가

    ArrayList<Object> x = new ArrayList<String>(); 
    

    을 사용하여 간단히 경우

    "클래스"와 아무 상관이있다 : 호환되지 않는 유형

    String 클래스가 Object의 서브 클래스이지만 ArrayList < Object>가 ArrayList과 다른 형식이기 때문에 호환되지 않는 유형입니다.String>을 참조하십시오. 그것은 Generics의 본질입니다.

    당신은

    void doSomething(String id, Class c) 
    
    +0

    감사합니다 @Chamil, 나는 이것을 사용하는 것을 고려하고 있었지만 메서드에 전달되는 'Class'인스턴스가 IFoobar 인터페이스를 구현했는지 확인하고 싶었습니다. 클래스를 사용함으로써, 나는 의도 한 것보다 더 넓은 범위의 객체를 전달할 수 있다고 기대할 것입니다. – user3404036

    관련 문제