暗黙的な変換は、Scala コンパイラーが型マッチングを実行するときに行われます。適切な型が見つからない場合、暗黙的な変換により、コンパイラーはスコープ内で適切な型を自動的に推測できます。
暗黙の値とは、パラメータを定義するときにパラメータの前に implicit を追加することを指します。暗黙的パラメーターとは、メソッドを定義するときに、メソッド内の一部のパラメーターが暗黙的に変更されることを意味します [カリー化を使用する必要があり、暗黙的パラメーターは最後に括弧内に記述する必要があります]。暗黙的な変換の機能は次のとおりです: メソッドを呼び出すときに、メソッド内の暗黙的なパラメーターを手動で渡す必要はありません。Scala はスコープ内の暗黙的な値を自動的に見つけて、それを自動的に渡します。
暗黙的な値と暗黙的なパラメーターは次の点に注意する必要があります:
1. 同じタイプのパラメーターの暗黙的な値はスコープ内で 1 回だけ出現でき、複数の定義が可能です。同じスコープ内で同じ型の暗黙的な値を定義することはできません。2. 暗黙的なキーワードは、暗黙的なパラメータ定義の先頭に配置する必要があります
3. メソッドに暗黙的な変換パラメータであるパラメータが 1 つだけある場合、そのパラメータは暗黙的な変換パラメータによって変更されます。キーワードは直接定義できます。呼び出し時にパラメータを渡さずに型を直接作成するだけです。
4. メソッドに複数のパラメーターがある場合、一部のパラメーターの暗黙的な変換を実現するには、カリー化を使用する必要があります。暗黙的なキーワードは最後に表示され、1 回だけ使用できます
package com.bjsxt.scala object ImplicitValue { /** * 隐式值和隐式参数需要注意以下几点: * 1.同类型的参数的隐式值只能在作用域内出现一次,同一个作用域内不能定义多个类型一样的隐式值。 * 2.implicit关键字必须放在隐式参数定义的开头 * 3.一个方法只有一个参数是隐式转换参数时,那么可以直接定义implicit关键字修饰的参数,调用时直接创建类型不传入参数即可。 * 4.一个方法如果有多个参数,要实现部分参数的隐式转换,必须使用柯里化这种方式,隐式关键字出现在后面,只能出现一次 */ // * 4.一个方法如果有多个参数,要实现部分参数的隐式转换, // 必须使用柯里化这种方式,隐式关键字出现在后面,只能出现一次 def Student(age:Int)(implicit name:String,i:Int) = { println(s"student = $name,age = $age,score = $i") } // * 3.一个方法只有一个参数是隐式转换参数时,那么可以直接定义implicit关键字修饰的参数, // 调用时直接创建类型不传入参数即可。 def Teacher(implicit name:String) = { println(s"teacher name is =$name") } def main(args: Array[String]): Unit = { // * 1.同类型的参数的隐式值只能在作用域内出现一次, // 同一个作用域内不能定义多个类型一样的隐式值。比如这里的String、Int类型,各自只能定义一个 implicit val name:String = "zhangsan" implicit val i:Int = 100 //这里使用了隐式参数,只用传入age那个参数,后面两个参数可以不填,默认使用隐式值 Student(100) //这里是直接使用了隐式值,可以不填参数,当然也可以给定参数,给定参数的话就是取给的参数的值 Teacher } }
出力結果: 対応する関数が自動的に検出され、暗黙的な変換が実行されます。
student = zhangsan,age = 100,score = 100 teacher name is =zhangsan
暗黙的変換関数は、キーワード implicit を使用して修正したメソッドです。 Scala の実行中に、型 A の変数がメソッド () メソッドを呼び出した場合、型 A の変数にはメソッド () メソッドがなく、型 B の変数にはこのメソッド () があることが判明したとします。この関数は、型 A を型 B に変換します。暗黙的な変換関数がある場合、型 A はメソッド() を呼び出すことができます。
暗黙的な変換関数 注: 暗黙的な変換関数は、関数のパラメーターの型と戻り値の型にのみ関連し、関数名とは関係がないため、異なる名前を付けることはできません。スコープ内のパラメータの型と戻り値の型が同じ 暗黙的な変換関数。
package com.bjsxt.scala class Animal(name:String){ def canFly()= { println(s"$name can fly....") } } class Rabbit(xname:String){ val name = xname } object ImplicitValue2 { //定义隐式转换函数 implicit def RabbitToAnimal(r:Rabbit):Animal = { new Animal(r.name) } //注意隐式转换函数只与参数类型和返回值类型有关, // 与函数名无关,所以不能定义两个相同类型的函数,虽然函数名不同,下面这个就是非法的 // implicit def Rabbit(r:Rabbit):Animal = { // new Animal(r.name) // } def main(args: Array[String]): Unit = { val rabbit = new Rabbit("rabbit") //这里rabbit调用不了canFly,因为Rabbit类中没有canFly方法, // 但定义了隐式转换函数,那就会往Animal类中找 rabbit.canFly() } }
実行結果:
rabbit can fly....
implicit キーワードで変更されたクラスは暗黙的クラスです。変数 A に特定のメソッドまたは変数がなく、この変数 A が特定のメソッドまたは特定の変数を呼び出すことができる場合、暗黙的クラスを定義できます。これらのメソッドまたは変数は暗黙的クラスで定義されます。暗黙的クラスでは A を渡すだけです。
暗黙的クラスに関する注意:
1. 暗黙的クラスは、クラス、パッケージ オブジェクト、およびコンパニオン オブジェクトで定義する必要があります
2. 暗黙的クラスの構築には 1 つのみを含める必要がありますパラメータ、同じタイプの構造を持つ暗黙のクラスを、同じクラス、パッケージ オブジェクト、およびコンパニオン オブジェクトに含めることはできません。
package com.bjsxt.scala //隐式类 class Rabbit1(xname:String){ val name = xname } object ImplicitValue3 { //定义隐式类,只能在object中定义,并且只能传入一个参数 //不能出现同类型构造的隐式类。(同类型:参数类型和返回值类型,与类名无关) implicit class Animal1(r:Rabbit1){ def showName() = { println(s"${r.name} is Rabbit....")//对象.属性需要加“{}” } } def main(args: Array[String]): Unit = { val rabbit = new Rabbit1("RABBIT") // Rabbit1类中没有showName方法,这是会找隐式类 rabbit.showName() } }
実行結果:
RABBIT is Rabbit....
以上がJava Scala で暗黙的な変換を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。