2016-08-26 3 views
1
에서 자바 자기 경계 클래스를 사용하는 방법

내가이 자기 경계 자바 클래스가 말 내가 예상 한대로 "테스트".스칼라

하지만 스칼라에서 같은를 작성 사투를 벌인거야 :

나는 그것이 SelfBounded [아무것도]을하게 유형을 통과하지 마십시오. 하지만 ': SelfBounded [SelfBounded]'와 같은 SelfBounded 형식을 사용하려고하면 재귀 적 특성으로 인해 문제가 발생하며 컴파일러에서 각 'SelfBounded'에 형식 매개 변수가 필요하다는 것을 알려줍니다.

object SelfBoundedMainScala extends App { 
    // here the type of selfBounded1 is SelfBounded[Nothing] 
    val selfBounded1 = new SelfBounded() 
    println(selfBounded1.testField) 
    // does not work since testMethod() returns a Nothing 
    //println(selfBounded1.testMethod().testField) 

    // trying to set the type of the selfBounded variable gives me issues because of the recursive type 
    // does not compile 'class SelfBounded takes type parameters' 
    // val selfBounded2: SelfBounded[SelfBounded] = new SelfBounded() 
    // same issue 
    // val selfBounded3 = new SelfBounded[SelfBounded]() 
} 

스칼라에서 자바 기본 클래스를 달성 할 수있는 방법은 SelfBounded 클래스 정의를 변경하지 않고 있습니까?

참고 : 이것은 스칼라에서 testcontainers-java를 사용하려고 시도하는 중 제거 된 예입니다.

답변

2

SelfBounded selfBounded = new SelfBounded()을 Java로 작성하면 raw types을 사용하고 있으며 이는 제네릭 사전 코드와의 호환성을 위해서만 존재합니다. 그러지 마. 올바른 방법은 SelfBounded을 확장하는 것입니다 : 스칼라에서

class SelfBounded1 extends SelfBounded<SelfBounded1> {} 

public class SelfBoundedMainJava { 
    public static void main(String[] args) { 
     // or SelfBounded<?> selfBounded 
     SelfBounded1 selfBounded = new SelfBounded1(); 
     System.out.println(selfBounded.testField); 
     System.out.println(selfBounded.testMethod().testField); 
    } 
} 

같은, 그것은 처음부터 형태 파라미터를 가지고 있기 때문에 그것이 원시 유형을 지원하지 않는 점을 제외하면 :

object SelfBoundedMainScala extends App { 
    class SelfBounded1 extends SelfBounded[SelfBounded1] 

    val selfBounded1 = new SelfBounded1() 
    println(selfBounded1.testField) 
    println(selfBounded1.testMethod().testField) 
} 
+0

감사합니다! 그것은 좋은 해결책입니다. 하지만 저는 왜 테스트 컨테이너 - 자바 예제에서 그렇게 사용하는지 궁금합니다. https://github.com/testcontainers/testcontainers-java-examples/blob/master/redis-backed-cache/src/test/java/RedisBackedCacheTest.java –

+0

자체 바인딩 클래스는 GenericContainer (https://github.com/)입니다. –

+0

이것은 실제로 원시 타입에 대해 합리적인 사용 일 수 있습니다 (먼저 본 적이 있습니다). 스칼라에서는'this.type'을 사용하여 동일한 결과를 얻을 수 있지만 자바에는 이에 상응하는 것이 없습니다. –