Any, AnyVal, AnyRef, Object 간의 관계는 무엇이며 Java 코드에서 사용될 때 어떻게 매핑됩니까?
나는 보통 컴파일 될 때까지 모든 조합을 시도합니다. 누군가 내가 어디에 사용해야하는지 설명 할 수 있습니까?
나는 한 가지 측면에서 Chris의 대답 에 동의하지 않을 것 입니다. 클래스 Any
, AnyRef
및 AnyVal
있습니다 클래스. 그러나 JVM의 본질적인 제한 때문에 바이트 코드에서 클래스로 나타나지 않습니다.
이것은 Java의 모든 것이 객체가 아니라는 사실에서 발생합니다. 객체 외에도 기본 요소가 있습니다. Java의 모든 객체는의 자손 java.lang.Object
이지만 기본 요소는 분리되어 있으며 현재 * 는 프로그래머가 확장 할 수 없습니다. 또한 프리미티브에는 메소드가 아닌 "연산자"가 있습니다.
반면에 Scala에서는 모든 것이 객체이고 모든 객체는 클래스에 속하며 메서드를 통해 상호 작용합니다. 생성 된 JVM 바이트 코드는이를 반영하지 않지만, 바이트 코드에 제네릭이 없더라도 Java가 제네릭을 가지고있는 것처럼 덜 그렇게 만들지는 않습니다.
따라서 Scala에서 모든 객체는의 자손 Any
이며 Java가 객체로 간주하는 것과 Java가 기본으로 간주하는 것을 모두 포함합니다. Java에는 그러한 통합이 없기 때문에 이에 상응하는 것이 없습니다.
Java에서 기본 요소로 간주되는 모든 것은 AnyVal
Scala의 후손입니다 . Scala 2.10.0 AnyVal
이 봉인 되기 전까지 는 프로그래머가 확장 할 수 없었습니다. 상호 운용성만으로도 Scala가 최소한 사용자 정의 "기본 요소"를 인식하도록 요구하기 때문에 .Net에서 Scala에서 어떤 일이 발생할지 보는 것은 흥미로울 것입니다.
또한 확장 Any
은 (JVM에서 AnyRef
)와 동등합니다 java.lang.Object
.
Scala 2.9.x까지는 사용자가 Any
or를 확장 하거나 AnyVal
Java에서 참조 할 수 없었지만 Scala에서 사용할 수있는 다른 용도 가 있었습니다 . 구체적으로 서명을 입력하십시오.
def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)
각각의 의미는 클래스 계층 구조에서 분명해야합니다. 참고로, 그러나, 즉 f
및 h
의지 자동 상자,하지만 g
하지 않습니다. 하는 자바는 점에서, 무엇의 반대 비트입니다 f
및 h
지정 될 수없고, g
(정의 java.lang.Object
자동 권투를 야기을).
사용자가 확장 할 수 있지만, 스칼라 2.10.0 시작 AnyVal
또는 Any
다음과 같은 의미로 :
클래스가 확장
AnyVal
되면 특정 조건에서 힙에 인스턴스가 생성되지 않습니다. 즉,이 클래스의 필드 (2.10.0에서는 단일 필드 만 허용됨-변경 사항이 계속 표시되는지 여부)가 기본 요소이든 다른 개체에 대한 참조 든 스택에 유지됩니다. 이를 통해 인스턴스화 비용없이 확장 메서드를 사용할 수 있습니다.형질 확장하는 경우
Any
, 다음 두 연장 클래스와 함께 사용할 수있는AnyRef
확장 클래스AnyVal
.
추신 : 제 생각에 Java는 "struct"primitives, 아마도 typedefs를 허용하는 데 C #을 따를 것 같습니다. 그들에 의존하지 않는 병렬 처리는 좋은 성능으로 달성하기 어렵 기 때문입니다.
봤어? 페이지의 텍스트에는 Java 상호 운용성 설명이 있습니다. http://www.scala-lang.org/node/128
Any
그리고 AnyVal
나는 생각 스칼라의 한 부분이다 형식 시스템 과 같은 클래스되지 않습니다 (같은 방법으로 Nothing
형식이 아닌 클래스이다). Java 코드 내에서 명시 적으로 사용할 수 없습니다.
그러나 Java / Scala 상호 운용에서 Java를 받아들이는 메서드 Object
는 scala Any
/ AnyRef
.
실제로 무엇을하려고합니까?
'Programming' 카테고리의 다른 글
postgresql의 문자열 리터럴 및 이스케이프 문자 (0) | 2020.08.13 |
---|---|
순서에 관계없이 두 목록에 동일한 요소가 있는지 확인합니까? (0) | 2020.08.13 |
Android 애플리케이션에서 조각을 언제, 왜 사용해야합니까? (0) | 2020.08.13 |
오류 : 'Node'에서 'appendChild'를 실행하지 못했습니다. 매개 변수 1이 'Node'유형이 아닙니다. (0) | 2020.08.13 |
문자, 코드 포인트, 글리프 및 자소의 차이점은 무엇입니까? (0) | 2020.08.13 |