回答:
ある意味で、クリスの 答えには同意しません。クラスAny
、AnyRef
そしてAnyVal
あるクラス。ただし、JVMの本質的な制限のため、バイトコードではクラスとして表示されません。
これは、Javaのすべてがオブジェクトではないという事実から生じます。オブジェクトに加えて、プリミティブがあります。Javaのすべてのオブジェクトはの子孫ですがjava.lang.Object
、プリミティブは別々に設定されており、現時点では*であり、プログラマは拡張できません。また、プリミティブにはメソッドではなく「演算子」があることに注意してください。
一方、Scalaでは、すべてがオブジェクトであり、すべてのオブジェクトはクラスに属し、メソッドを介して相互作用します。生成されたJVMバイトコードはこれを反映していませんが、バイトコードにジェネリックが含まれていない場合でも、Javaにジェネリックが含まれているのと同じように、JVMバイトコードにはそれが反映されています。
したがって、Scalaでは、すべてのオブジェクトはの子孫でありAny
、Javaがオブジェクトと見なすものとJavaがプリミティブと見なすものの両方が含まれます。そのような統一がないため、Javaには同等のものはありません。
Javaでプリミティブと見なされるものはすべてAnyVal
、Scalaの子孫です。Scala 2.10.0までAnyVal
は封印され、プログラマはそれを拡張できませんでした。相互運用性だけでScalaは少なくともユーザー定義の「プリミティブ」を認識する必要があるため、.Net上のScalaで何が起こるかを見るのは興味深いはずです。
また、拡張Any
はAnyRef
に相当しますjava.lang.Object
(これは、とにかくJVM上で)。
Scala 2.9.xまでは、ユーザーはJavaからそれらを拡張しAny
たりAnyVal
、参照したりすることはできませんでしたが、Scalaで使用できる他の用途がありました。具体的には、型シグネチャ:
def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)
それぞれの意味は、クラス階層から明らかです。注目すべきは、しかし、それであるf
とh
意志オートボックスが、g
しません。これはJavaのことで、何の反対のビットであるf
とh
指定することはできません、とg
(で定義されたjava.lang.Object
オートボクシングを引き起こす)を。
ただし、Scala 2.10.0以降では、ユーザーは次のセマンティクスでAnyVal
orまたはを拡張できAny
ます。
クラスがextendsの場合、AnyVal
特定の条件下では、そのクラスのインスタンスはヒープ上に作成されません。これは、このクラスのフィールド(2.10.0では、単一のフィールドのみが許可されます-変更が見られるかどうかにかかわらず)は、プリミティブであっても、他のオブジェクトへの参照であっても、スタックにとどまります。これにより、インスタンス化のコストなしに拡張メソッドを使用できます。
形質が拡張する場合Any
、それは両方拡張するクラスで使用することができるAnyRef
と拡張するクラスAnyVal
。
PS:私の見解では、JavaはC#に従って「struct」プリミティブを許可する可能性が高く、typedefを使用する可能性があります。これは、それらに頼らずに並列処理を行うと、優れたパフォーマンスで達成することが困難になるためです。
これ見た?ページのテキストには、いくつかのJava相互運用性に関する注釈があります。 http://www.scala-lang.org/node/128
Any
そして、AnyVal
され、Iは、Scalaの一部と信じ型システムとのようなクラスではない(同様にNothing
タイプしないクラスです)。Javaコード内から明示的に使用することはできません。
ただし、Java / Scalaの相互運用では、Javaを受け入れるメソッドObject
はscala Any
/ を期待しAnyRef
ます。
実際に何をしようとしていますか?
AnyRef
は、これがまだ私には不思議であることを思い出させてくれました。
AnyVal
として定義されていsealed trait AnyVal extends Any
ます。しかし、Scala 2.10ではこれがに変更されabstract class AnyVal extends Any with NotNull
、AnyVal
新しい値クラス機能で拡張できるようになりましたclass MyValue(val u: Int) extends AnyVal
。例:。