ホームページ >Java >&#&チュートリアル >Java Scala で暗黙的な変換を使用する方法

Java Scala で暗黙的な変換を使用する方法

WBOY
WBOY転載
2023-05-14 16:46:06940ブラウズ

暗黙的な変換は、Scala コンパイラーが型マッチングを実行するときに行われます。適切な型が見つからない場合、暗黙的な変換により、コンパイラーはスコープ内で適切な型を自動的に推測できます。

1. 暗黙の値と暗黙のパラメータ

暗黙の値とは、パラメータを定義するときにパラメータの前に 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

2. 暗黙的変換関数

暗黙的変換関数は、キーワード 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....

3. 暗黙的クラス

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。