나는 Scala를 처음 접했고 재미있게 언어를 배우기 시작했고 여전히 그것에 대해 머리를 돌리려고 노력하고 있습니다. Scala 특성에 대한 나의 이해는 일부 메소드가 구현을 가질 수 있다는 점을 제외하고는 Java 인터페이스와 같다는 것입니다.
Java 8은 구현이 제공 될 수있는 기본 메소드를 가질 수있는 인터페이스를 추가하고 있습니다.
Java 8 인터페이스와 Scala 특성의 유사점과 차이점은 무엇입니까?
나는 Scala를 처음 접했고 재미있게 언어를 배우기 시작했고 여전히 그것에 대해 머리를 돌리려고 노력하고 있습니다. Scala 특성에 대한 나의 이해는 일부 메소드가 구현을 가질 수 있다는 점을 제외하고는 Java 인터페이스와 같다는 것입니다.
Java 8은 구현이 제공 될 수있는 기본 메소드를 가질 수있는 인터페이스를 추가하고 있습니다.
Java 8 인터페이스와 Scala 특성의 유사점과 차이점은 무엇입니까?
답변:
Java 8의 기본 메소드 와 Scala 특성에 대한 동기는 다릅니다.
전자는 안전한 API 진화와 제한된 형태의 다중 상속을 지원하기 위해 도입되었습니다. 예를 들어, Project Lambda에서 함수형 프로그래밍 관용구를 활용하면 가능한 모든 구현 forEach(lambda)
자를 java.util.Collection
변경하지 않고 인터페이스 하는 방법을 추가하는 것이 유익했습니다 (실제로 이전 버전과의 호환성을 깨지 않고는 불가능 함). 부작용으로 이것은 또한 믹스 인 구성 의 형태를 제공했습니다 .
Scala 특성 은 모듈 식 구성 요소 구성을위한 빌딩 블록으로 처음부터 설계되었습니다. 다중 상속에 친숙하며 선형화로 인해 믹스 인의 평가 순서에 엄격한 규칙을 적용하여 다이아몬드 문제 가 없습니다 . 또한 상태를 지원하고 구현 클래스를 참조하고 혼합 할 수있는 유형에 제한을 둘 수 있습니다. 특성이 철저하게 사용되는 Scala 컬렉션 라이브러리를 살펴보십시오.
함께합니다 스칼라 2.12.0 RC1 (2016년 9월) , Trait
이제 인터페이스로 컴파일합니다.
Scala 2.12는 Java 8의 새로운 기능을 최적으로 사용하는 것입니다.
인터페이스에서 구체적인 메소드를 허용하는 Java 8을 통해 Scala 2.12는 트레이 트를 단일 인터페이스로 컴파일 할 수 있습니다.
이전에는 특성이 메서드 구현과 인터페이스를 보유하는 클래스로 표현되었습니다 .
컴파일러는 여전히이면에서 수행 할 수있는 약간의 마법이 있으므로 특성이 Java로 구현 될 경우주의해야합니다.
(간단히 말해, 트레이 트가 다음 서브 클래스 중 하나를 수행하는 경우 합성 코드가 필요합니다. 필드 정의, super 호출, 본문의 이니셜 라이저 문, 클래스 확장, 선형화에 의존하여 올바른 슈퍼 트레이 트에서 구현을 찾습니다.)
scala PR 5003 의 구현 차이를 더 참조하십시오 .
유사성에서 둘 다 기본 방법을 가질 수 있습니다.
차이점 측면에서는 전체 클래스가 아닌 인스턴스에만 특성을 추가 할 수 있습니다. 예:
trait A { def m = ??? }
class B
new B() with A
마찬가지로 인스턴스에 트레이 트 레이어를 계속 추가 할 수 있습니다.