2014-02-08 1 views
-1

Object 유형의 변수 입력 인수가 필요한 Java 인터페이스가 있습니다.Object args가있는 인터페이스 메소드의 Java 호출 구현

public interface TestInterface <I,O>{ 
    public O invoke(I...inputs); 
} 

public class FirstClass implements TestInterface<String, Object>{ 
     @Override 
    public Object invoke(String... input){ 
     System.out.println("inside VO"); 
     return "Tet"; 
    } 
} 

내가 이것을 호출하려고하는 주요 클래스. 나는이를 호출 할 때

public class Main{ 
     public static void main(String[] args){ 
      FirstClass voDS=new FirstClass(); 
      TestInterface ds=voDS; 
      ds.invoke("abc"); 
     } 
    } 

, 나는 ClassCast Exception Object not compatible with String error를 얻을. 이 호출 할 수있는 해결 방법이 있습니까? 내가 당신에게 대답을하기 전에

+1

예제는 Java 7에서 컴파일 할 때 오류가 없습니다. – Juvanis

+2

컴파일 오류가 발생하지 않습니다. 그것은 런타임 예외입니다. Java 6을 사용합니다. – Apps

+0

그래서 어떤 줄에서 오류가 발생합니까? – Kayaman

답변

1

먼저 맞춤법의이 시점에 저와 동의해야합니다 :

이 조각 :

:

FirstClass voDS = new FirstClass(); 
TestInterface ds = voDS; 
ds.invoke("abc"); 

을 ...에 해당

TestInterface voDS = new FirstClass(); 
voDS.invoke("abc"); 

컬렉션을 만들 때 사용되는 패턴입니다. 인터페이스는 구체적인 클래스와 반대로 사용됩니다. 길의 밖으로

,의 인터페이스에 대한 호기심 속성을 관찰하자

public O invoke(I...inputs); 

이봐, 즉, 그 유형 매개 변수, 안 그래? I 유형은 TestInterface<I, O> 선언과 연관됩니다. 이는 우리가 인터페이스 추상화를 사용할 때 일반적인 유형 인 I을 기대한다는 것을 의미합니다.

이제 우리는 구체적인 구현에 도달했습니다 ... 동일한 제네릭 경계를 공유하지 않습니다!

public class FirstClass implements TestInterface<String, Object> 

어 - 오. 타입 소거로 인해 우리는 이것을 구체적인 구현으로 사용하려고 시도 할 때 raw 타입을 얻게 될 것이고 은 vararg 배열로 ClassCastException이 될 것입니다.

해결 방법은 간단합니다. 은 보조 클래스와 관련하여 인터페이스의 인스턴스를 선언 할 때 구체적인 유형을 사용합니다.

TestInterface<String, Object> voDS = new FirstClass(); 
voDS.invoke("abc"); 

지금, 당신의 인터페이스는 가변 인자 필드에 기대해야 매개 변수의 유형, 그리고 반환해야하는지 알고있다.

이제는 이 아닙니다. 제네릭을 사용하는 것이 좋습니다. 제대로 작동하려면 일반적인 유형을 백업 클래스에 제공해야합니다.

관련 문제