복붙노트

[SCALA] 원시 스칼라 타입을 갖는 구현 방법

SCALA

원시 스칼라 타입을 갖는 구현 방법

나는 스칼라 (자바로 작성된) Drools가 플래너 사용에 문제가 있습니다. Drools가 플래너의 인터페이스 중 하나는 다음과 같이 선언한다 :

public interface Score<S extends Score> extends Comparable<S>

그러나 원시 유형으로 다른 인터페이스에서 사용하는 '점수'

public interface Solution {
    Score getScore();

그럼 난 스칼라에서이 인터페이스를 구현하고 싶습니다 :

class MySolution extends Solution {
    def getScore: Score = ...

그리고 컴파일 오류가 발생합니다 : 스칼라 컴파일러 것을 허용하지가 '데프 getScore : 점수를 그냥 쓰기. 나는 컴파일러가 타입 호환성에 대해 불평 '점수 [_]'또는 '[무엇이든] 점수'를 추가하려고 할 때. 어떻게해야합니까?

해결법

  1. ==============================

    1.Drools가 플래너 (5.2.0.M2)의 다음 버전은이 문제를 해결합니다. 여기가 자식에 커밋합니다.

    Drools가 플래너 (5.2.0.M2)의 다음 버전은이 문제를 해결합니다. 여기가 자식에 커밋합니다.

    어떤 경우에는, 사람들은 정확히 최적의 솔루션에 위반되는 어떤 하드 또는 소프트 제한 유형에 따라 사용자에게 보여줄 수 있도록, 자신의 점수 구현 (예를 들어 NurseRosterScore 구현을위한 HardAndSoftScore)를 정의하고 싶다. 이 변경 사항은 (가능 이미 비록) 쉽고 깨끗한 있는지 확인하는 첫 번째 단계입니다.

  2. ==============================

    2.Java 인터페이스가 필요하고 어떤 스칼라가 허용하는 길이 사이의 다리 역할을하는 자바 클래스를 작성한다.

    Java 인터페이스가 필요하고 어떤 스칼라가 허용하는 길이 사이의 다리 역할을하는 자바 클래스를 작성한다.

    SolutionBridge.java:

    abstract class SolutionBridge implements Solution {
        public Score getScore() {
            return scalaGetScore();
        }
    
        abstract Score<?> scalaGetScore();
    }
    

    SolutionScala.scala :

    class SolutionScala extends SolutionBridge {
        def scalaGetScore() = null.asInstanceOf[Score[_]]
    }
    
  3. ==============================

    3.당신이 생략 오류 메시지는 관계없는 세부 사항이 아니다. 다시 "나는 또한에 스칼라에서 일부 지원을 기대하는이"당신은 또한 선택 하 당신이 그들을 이해하지 못하는 경우 질문을하기보다는 막연을 부연하면, 그것들을 포함, 오류 메시지를 읽어 과정에 참여하고 있습니다.

    당신이 생략 오류 메시지는 관계없는 세부 사항이 아니다. 다시 "나는 또한에 스칼라에서 일부 지원을 기대하는이"당신은 또한 선택 하 당신이 그들을 이해하지 못하는 경우 질문을하기보다는 막연을 부연하면, 그것들을 포함, 오류 메시지를 읽어 과정에 참여하고 있습니다.

    오류 메시지,은이를 매우 중요하게 생각합니다. 에도가 혼란하고 있습니다. 특히 때이 혼란하고 있습니다.

    여기에 2.8.1의 오류는 다음과 같습니다

    a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: Score];
     method getScore has incompatible type
      def getScore: Score[_] = null
          ^
    one error found
    

    여기에 트렁크와 오류는 다음과 같습니다

    a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: AnyRef];
     method getScore has incompatible type
      def getScore: Score[_] = null
          ^
    one error found
    

    중요한 차이점은, 거기있는 오류 메시지가 나를 지시로 내가 할 때 트렁크와 함께 작동 이유에 어떤 기여.

    // this compiles with 2.9, but not with 2.8
    class MySolution extends Solution {
      def getScore: Score[_ <: AnyRef] = null
    }
    

    (첫 번째 경계 두 번째 모양을 한 위치에 있지만 다른에 묵시적 존재 형식 인수와 타입 생성자와 같은) 원시 형의 점수가 자바 소스에서 사용되는 방법은 그것이 어디 작동 궁금합니다. 당신은 이런 종류의 물건을 수용합니다 많은 피해가 이미 컴파일러에 가한 방법을 알고 싶지 않아요. 그것은 원시 유형의 단지 일 경우 좋은 될 것 사실이지만 많은 것이 좋을 것이다. 어떤 것들은 몇 가지 바람직하지 않은 불가능하며, 몇 가지 선박 해상을 유지하는 사람들의 작은 숫자에서 너무 많은 노력을 필요로한다. 원시 유형은 트리플 크라운을 승리.

  4. ==============================

    4.당신은 캐스트 점수 것을 시도했다 :

    당신은 캐스트 점수 것을 시도했다 :

    val s = solution.getScore.asInstanceOf[Score[Int]]
    
  5. from https://stackoverflow.com/questions/5279149/implementing-methods-having-raw-types-in-scala by cc-by-sa and MIT license