Java Scala で暗黙的な変換を使用する方法
暗黙的な変換は、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
