2016-03-30 8 views
3

行くとScalaの両方が実行時に型をチェックする方法を提供を知っていますか:どのようにプログラムがプリミティブのランタイムのタイプの静的型付け言語

スカラ:

class A 
class B extends A 

val a: A = new A // static type: A dynamic type: A 
val ab: A = new B // static type: A dynamic type: B 
val b: B = new B // static type: B dynamic type: B 

def thing(x: Any): String = x match { 
    case t: Int => "Int" 
    case t: A => "A" 
    case t: B => "B" 
    case t: String => "String" 
    case _ => "unknown type" 
} 

ゴー:

package main 

import (
    "fmt" 
    "reflect" 
) 

struct A { 
    field1 int 
    field2 string 
} 

func printTypeOf(t interface{}) { 
    fmt.Println(reflect.TypeOf(t)) 
} 

func main() { 
    i := 234234 // int 
    s := "hello world" // string 
    p := &A{3234234, "stuff"} // *A 

    fmt.Print("The type of i is: ") 
    printTypeOf(i) 
    fmt.Print("The type of s is: ") 
    printTypeOf(s) 
    fmt.Print("The type of p is: ") // pass a pointer 
    printTypeOf(p) 
    fmt.Print("The type of the reference of p is: ") // pass a value 
    printTypeOf(*p) 
} 

これは内部でどのくらい正確に機能しますか?私は構造体とクラスを想定していますが、オブジェクトの型は隠しフィールドに格納されています(golangの構造体は実際に構造体{field1 int field2 string type type}です)しかし、どのように機能するかは11010110で与えられ、メモリアドレスへのポインタ214、整数214または文字Öすべての値は、その型を表すバイトで密かに渡されますか?

+3

あなたの推測は間違っていますが、Go構造体には隠しフィールドはありません。すべての型はコンパイル時にコンパイラに知られています。 – JimB

+0

単純に言えば、 'printTypeOf(x)'を呼び出すと、xはインターフェース値にラップされます。この値には、あなたが考えていた「隠しフィールド」があります。 – thwd

+0

それはラップされているので、それは意味があります – user2850249

答えて

2

Scalaでは、各オブジェクトにクラスへのポインタがあります。thingにプリミティブの引数(IntCharなど)は、それが自動的にオブジェクト(java.lang.Integerjava.lang.Character、など)。あなたのコード内Int戦が実際にInteger戦に変換されます。

に箱入りですゴーで

は、型が構造体に格納されていないが、インタフェース値に:あなたはprintTypeOf(whatever)を呼び出すとき

Interface values are represented as a two-word pair giving a pointer to information about the type stored in the interface and a pointer to the associated data. Assigning b to an interface value of type Stringer sets both words of the interface value.

だから、whateverinterface {}に変換され、その種類は、この中に保存されています新しい値はwhateverと一緒になります。

+0

私はそれがGoでのインタフェース{}型とScalaのオブジェクトでどのように動作するか見ることができます。ちょうど正しいオフセットを使用して、型情報を取得してください。しかし、私が11010110バイトで表される普通の古い整数を渡すと、ポインタや文字ではなく整数として扱っていることが分かり、整数型へのポインタで囲みます。 – user2850249

+0

つまり、スカラボックス11010110は、値がÖのCharacterクラスではなく、値フィールドが214のIntegerクラスにどのようにして変換されますか? – user2850249

+0

"しかし、私が11010110バイトで表される普通の古い整数を渡すと、その静的型によって、整数として意味することをどうやって知ることができますか?もしそれが 'Int'ならば' Char'を 'Character'に' 'Integer'に囲み、' Any'ならばそれは既にボックス化されています。 –

関連する問題