Any, AnyVal, AnyRef, Object 간의 관계는 무엇이며 Java 코드에서 사용할 때 어떻게 매핑합니까?


111

나는 보통 컴파일 될 때까지 모든 조합을 시도합니다. 누군가 내가 어디에 사용해야하는지 설명 할 수 있습니까?

답변:


125

한 가지 측면에서 Chris의 답변 에 동의하지 않습니다 . 클래스 Any, AnyRefAnyVal 있습니다 클래스. 그러나 JVM의 본질적인 제한 때문에 바이트 코드에서 클래스로 나타나지 않습니다.

이것은 Java의 모든 것이 객체가 아니라는 사실에서 발생합니다. 객체 외에도 기본 요소가 있습니다. Java의 모든 객체는의 자손 java.lang.Object이지만 기본 요소는 분리되어 있으며 현재 * 는 프로그래머가 확장 할 수 없습니다. 또한 프리미티브에는 메소드가 아니라 "연산자"가 있습니다.

반면 스칼라에서는 모든 것이 객체이고 모든 객체는 클래스에 속하며 메서드를 통해 상호 작용합니다. 생성 된 JVM 바이트 코드는이를 반영하지 않지만, 바이트 코드에 제네릭이 없더라도 Java가 제네릭을 가지고있는 것처럼 덜 그렇게 만들지는 않습니다.

따라서 Scala에서 모든 객체는의 자손 Any이며 여기에는 Java가 객체로 간주하는 것과 Java가 기본으로 간주하는 것이 모두 포함됩니다. Java에는 그러한 통합이 없기 때문에 이에 상응하는 것이 없습니다.

Java에서 기본 요소로 간주되는 모든 것은 AnyValScala의 후손입니다 . Scala 2.10.0 AnyVal이 봉인 되기 전까지 는 프로그래머가 확장 할 수 없었습니다. 상호 운용성만으로도 Scala가 최소한 사용자 정의 "기본 요소"를 인식하도록 요구하기 때문에 .Net에서 Scala에서 어떤 일이 발생할지 보는 것은 흥미로울 것입니다.

또한 확장 Any은 (JVM에서 AnyRef)와 동등합니다 java.lang.Object.

Scala 2.9.x까지는 사용자가 Anyor를 확장 하거나 AnyValJava에서 참조 할 수 없지만 Scala에서 사용할 수있는 다른 용도 가 있었습니다 . 특히 다음과 같이 서명을 입력하십시오.

def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)

각각의 의미는 클래스 계층 구조에서 분명해야합니다. 참고로, 그러나, 즉 fh의지 자동 상자,하지만 g하지 않습니다. 하는 자바는 점에서, 무엇의 반대 비트입니다 fh지정 될 수없고, g(정의 java.lang.Object자동 권투를 야기을).

그러나 Scala 2.10.0부터 사용자는 다음 의미 체계를 사용하여 AnyVal또는 을 확장 할 수 있습니다 Any.

  • 클래스가 확장 AnyVal되면 특정 조건에서 힙에 인스턴스가 생성되지 않습니다. 즉,이 클래스의 필드 (2.10.0에서는 단일 필드 만 허용됨-변경 사항이 계속 표시되는지 여부)가 기본 요소이든 다른 개체에 대한 참조 든 스택에 유지됩니다. 이를 통해 인스턴스화 비용없이 확장 메서드를 사용할 수 있습니다.

  • 형질 확장하는 경우 Any, 다음 두 연장 클래스와 함께 사용할 수있는 AnyRef확장 클래스 AnyVal.

추신 : 제 생각에 Java는 "struct"primitives 및 typedefs를 허용하는 데 C #을 따를 가능성이 있습니다. 이에 의존하지 않는 병렬 처리는 좋은 성능으로 달성하기 어렵 기 때문입니다.


2
업데이트 : 스칼라 2.9.2의로, AnyVal로 정의된다 sealed trait AnyVal extends Any. 그러나 Scala 2.10에서 이것은로 변경되었으며 abstract class AnyVal extends Any with NotNull, 이제 AnyVal새로운 값 클래스 기능 으로 확장 할 수 있습니다 class MyValue(val u: Int) extends AnyVal. 예 : .
ebruchez

@ebruchez 메모 감사합니다. 새로운 기능에 대한 개요로 답변을 업데이트했습니다.
Daniel C. Sobral 2012 년

Nothing 및 Null은 이것과 어떤 관련이 있습니까?
Gaurav Khare


5

Any그리고 AnyVal나는 생각 스칼라의 한 부분이다 형식 시스템같은 클래스되지 않습니다 (같은 방법으로 Nothing형식이 아닌 클래스이다). Java 코드 내에서 명시 적으로 사용할 수 없습니다.

그러나 Java / Scala 상호 운용에서 Java를 받아들이는 메서드 Object는 scala Any/ AnyRef.

실제로 무엇을하려고합니까?


이 주제를 더 잘 이해하여 Java가 Scala를 호출하거나 그 반대로 할 계획 일 때 어떤 유형을 사용해야하는지 알 수 있도록 노력하고 있습니다. 이 대답은 stackoverflow.com/questions/2334200/… 그리고 그 캐스트 AnyRef는 이것이 나에게 여전히 신비 스럽다는 것을 상기시켜주었습니다.
huynhjl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.