2013-05-07 1 views
59

저는 스칼라를 처음 접했을 때 재미있게 언어를 배우기 시작했습니다. 아직 그 문제를 해결하려고 노력 중입니다. 스칼라 형질에 대한 나의 이해는 몇몇 메소드가 구현을 할 수 있다는 점을 제외하면 자바 인터페이스와 같다는 것이다.Scala 특성과 Java 8 인터페이스 간의 차이점은 무엇입니까?

Java 8은 구현을 제공 할 수있는 기본 메소드를 가질 수있는 인터페이스를 추가하고 있습니다.

Java 8 인터페이스와 Scala 특성의 유사점과 차이점은 무엇입니까?

+4

해당 웹 사이트를 방문하면 도움이 될 것입니다. http://www.infoq.com/articles/java-8-vs-scala – CRazyProgrammer

+3

tl; dr : ** 가상 확장 방법의 기본 동기는 [기본 방법]입니다. API 진화. 환영받는 부작용은 행동에 국한된 다중 상속의 형태를 제공한다는 것입니다. 스칼라의 형질은 행동의 여러 상속을 제공 할뿐만 아니라 상태도 상속합니다. 상태와 행동 상속 외에도 특성은 구현 클래스에 대한 참조를 얻을 수있는 방법을 제공합니다. [Scala] 특성은 [Java 8의] 가상 확장 메소드보다 더 풍부한 기능 세트를 제공합니다. ** –

답변

32

동기 부여 Java 8 '기본 방법스칼라 특성이 다릅니다.

이전 버전은 안전한 API 진화 및 제한된 다중 상속을 지원하기 위해 도입되었습니다. Project Lambda의 함수형 프로그래밍 관용구를 활용하면 가능한 모든 구현자를 변경하지 않고 java.util.Collection 인터페이스에 forEach(lambda) 메서드를 추가하는 것이 유리합니다 (역 호환성을 해치지 않고 실제로는 불가능합니다). 부작용으로 이는 또한 mixin composition의 형식을 제공합니다.

스칼라 특성은 모듈 식 구성 요소 구성을위한 빌딩 블록으로 처음부터 설계되었습니다. 그들은 다중 상속 친화적이며 diamond problem을 가지지 않습니다. 선형화로 인해 믹스 인의 평가 순서가 엄격합니다. 그들은 또한 상태를 지원하고 구현 클래스를 참조 할 수 있으며 어떤 유형이 혼합 될 수 있는지 제한 할 수 있습니다. 형질이 철저하게 사용되는 Scala 컬렉션 라이브러리를 살펴보십시오.

9

scala 2.12.0 RC1 (Sept. 2016)을 사용하면 Trait이 이제 인터페이스로 컴파일됩니다.
스칼라 2.12 모든 Java 8의 새로운 기능의 최적 활용

자바 (8)와 인터페이스의 구체적인 방법을 허용 관한 스칼라 2.12 단일 인터페이스로 특성을 컴파일 할 수 있습니다.

이전에는 특성이 메서드 구현을 유지하는 클래스와 인터페이스으로 표시되었습니다.
컴파일러는 여전히 장면 뒤에서 수행 할 수있는 많은 마법이 있으므로 Java에서 특성을 구현하려면주의해야합니다.
(간단히 말해서 특성이 다음 중 하나를 수행하는 경우 해당 하위 클래스는 필드 정의, 본문에서의 초 기자 문 작성, 클래스 확장, 올바른 수퍼 특성으로 구현을 찾기 위해 선형화에 의존하는 합성 코드가 필요합니다.)

자세한 내용은 scala PR 5003을 참조하십시오.

관련 문제