2016-08-17 4 views
1

私はスカラー言語の初心者ですが、私はスカラーのAnyクラスと混同しています。スカラーのクラス

def f(x: Any) = println(x) 

は、コードの上にあるx変数は、任意のデータ型であってもよいことを表すxはなぜ、任意の型を受け入れることができるかどうか

def f(x:Any)=x+5 
<console>:13: error: type mismatch; 
found : Int(5) 
required: String 
     def f(x:Any)=x+5 

:(例:int型、文字列など)

書き換えコード私はエラーを上回っています。私はの理解をスカラーに混同しているかもしれません。私を修正してください。 mAによって定義されている場合、あなただけのタイプAの値xにメソッドmを呼び出すことができる静的型付け言語で

+1

もし 'x'がどんな型であってもよいなら、あなたはいつも5を加えることができると確信することはできません。' f( "hello"); ' –

+0

@ArnaudDenoyelleあなたは 'int'を' String'に追加することができます。より良い例は '+'演算子をオーバーライドしないクラスです。 – SamTebbs33

+0

実際、 'A <:Any''と' B''の 'b'のインスタンス' a'の場合、 'val c = a + x'という形式の式は実際に' a。+(x ) 'これはあなたのクラスAが' def [B、C] +(b:B): 'メソッドを持っている場合にのみ動作することを意味します。 –

答えて

4

Anyの性質上、Anyには(toStringhashCodeのようないくつかのものを除いて)呼び出すことのできる便利なメソッドはありませんが、確かにプラスの操作は定義されていません。 BooleanAnyのサブタイプであるため、Booleanが許可されているとします。コンパイラがあなたのコードを許可していれば、Boolean+というようなものがないので、問題に遭遇します。動的に型指定された言語では、そのコードを実行すると実行時エラーが発生します。


あなたは文字列で物事を連結することが可能である暗黙の型変換に+に起因した文字列を連結することができますので、エラーメッセージは、奇妙に見える:

def f(x: Any) = x + "hello" // implicitly converts x to a string 

f(true) // "truehello" 

これは偉大な混乱の源であり、 hopefullyは言語から消えます。あなたが別の方法を使用した場合、エラーがより明確になります:あなたはprintln()ソースを見れば

def f(x:Any)=x-5 

<console>:54: error: value - is not a member of Any 
     def f(x:Any)=x-5 
        ^
+0

あなたは暗黙の言葉が言語から削除されるべきだと言っていますか? – SamTebbs33

+2

@ SamTebbs33 'Predef'の' any2stringadd'メソッドは非常に面倒なので削除する必要があります。これは、ここでのエラーメッセージの奇妙な言葉遣いの理由です。例では '-'と' + 'を入れてください。違いが分かります。 –

+0

AnyからStringへの変換がある場合、なぜint 5がStringに変換されないのですか? Intはいずれかのサブクラス – Samar

0

はあなたが表示されます。

public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (this) { 
      print(s); 
      newLine(); 
     } 
    } 

String.valueOf

public static String valueOf(Object obj) { 
     return (obj == null) ? "null" : obj.toString(); 
} 

クラスAnyですすでにtoStringメソッドを持っていますが、+メソッドを持っていません(あなたはすべての演算子が+-などが方法であり、http://tomjefferys.blogspot.com/2011/11/operator-overloading-in-scala.htmlを参照)。

+0

概念!! – vivman

関連する問題