2012-07-24 2 views
3

I가 자바 코드에서 사용되는 용어의 정의는 다음 : (콘크리트 포트 클래스에서 입력)스칼라 코드에서 자바에 정의 된 재귀 일반적인 유형을 사용

추상 포트 정의 :

package test; 

public class Port< 
    PortOptions extends Port.Options, 
    ConcretePort extends Port<PortOptions, ConcretePort>> { 

    public interface Options { 
    } 

} 

포트 서비스 정의 (일부 콜백 메커니즘을 통해 포트로 일부 작업을 수행 할 수 있음)

package test; 

import java.util.Set; 

public class PortService { 
    public interface Callback<T> { 
     void processData(T data); 
    } 

    public void methodWithCallback(Callback<Set<Port>> callback) { 

    } 
} 

그리고 콜백을 scala의 포트 서비스에 등록하려고합니다. 내가 뭘하려고하는 것은 이것이다 :

package test 

import test.PortService.Callback 
import java.util 

class PortServiceCaller { 

    def callingMethod() { 
     val portService: PortService = new PortService 

     portService.methodWithCallback(new Callback[java.util.Set[Port[_, _]]] { 
      def processData(data: util.Set[Port[_, _]]) { 

      } 
     }) 
    } 
} 

을하며 함께 비참하게 실패

error: type mismatch; 
found : java.lang.Object with test.PortService.Callback[java.util.Set[test.Port[_, _]]] 
required: test.PortService.Callback[java.util.Set[test.Port[_ <: test.Port.Options, _ <: test.Port[?0,?1]]]] 
portService.methodWithCallback(new Callback[java.util.Set[Port[_, _]]] { 

질문입니다 : 어떻게 내가 제대로 자바 서비스를 호출 할 수 있도록하기 위해 스칼라 코드를 작성하는 방법?

나는 스칼라 타이핑 시스템을 살펴 봤는데 알아낼 수 없다.

나중에 편집 :

과 같이 콜백 메소드를 선언 :

public void methodWithCallback(Callback<Set<Port<?, ?>>> callback) { 

    } 

와 같은 스칼라에서 호출 :

portService.methodWithCallback(new Callback[java.util.Set[Port[_, _]]] { 
     def processData(data: java.util.Set[Port[_, _]]) { 
     } 
    }) 

이 솔루션은 충분히 실제로 간단하다

또한 의미가 있습니다. 두 언어 모두의 타입 시스템.

답변

3

Java 컴파일러가 게으르며 검사하지 않기 때문에 Java에서 수행하는 작업은 위험한 작업이며 코드가 컴파일됩니다.

public void methodWithCallback(Callback<Set<Port>> callback) { 

    } 

당신은 기본적으로 포트에 대한 모든 유형의 정보를 멀리 던지고있다 : 당신이 쓸 때

Port<PortOptions extends Port.Options, ConcretePort extends Port<PortOptions, ConcretePort>> 

전체 정보가 될 수 없습니다, 그리고 자바 컴파일러는 유형 매개 변수를 생략 할 수 . 스칼라에서는 이것이 가능하지 않으며 형식 매개 변수뿐만 아니라 형식 제약도 올바르게 표현해야합니다. 여기에있는 첫 번째 질문은 왜 거기에 알려지지 않은 유형을 말하지 않고 포트를 작성하는 이유입니다.

public void methodWithCallback(Callback<Set<Port<?,?>>> callback) { 

} 

은 올바른 방법입니다. 지금 여러 알 수없는 유형 사이의 경계 관계를 표현하려면

, 당신은 간단한 경계에 적합 실존 유형 _ 컴팩트를 사용할 수 없지만 당신은, 그러나

class Port[A,B<:A] 

    def myMethod(a:Port[A,B]forSome {type B; type B<:A}) 

forSome 사용해야합니다 저는 이러한 패턴을 사용하여 결말을내는 것이 당신의 디자인이 약하고 당신의 문제를 해결할 수있는 더 깨끗하고 우아한 방법 일지 모른다고 말하는 경향이 있습니다. 타입 안전에 관한 정보를 버릴 필요가 있다면 제네릭 사용의 요지는 무엇입니까?

+0

아 .. 저는 항상 ParametrizedType 이 ParametrizedType과 다른 것을 잊어 버립니다. 고마워. 나는 이것으로 그것을 해결할 수 있었다. –

관련 문제