Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7910

【Scala】Scala ~ asInstanceOf / isInstanceOf ~ - プログラム の超個人的なメモ

$
0
0

■ はじめに

今更だが、Scala の asInstanceOf / isInstanceOf を扱う。

目次

【1】asInstanceOf
【2】isInstanceOf
【3】サンプル
 例1:implicit Class の メソッド

【1】asInstanceOf

* Scala の キャスト

【2】isInstanceOf

* Scala の データ型判定

【3】サンプル

例1:implicit Class の メソッド

* 以下の関連記事のサンプルを拡張したものを作ってみた

https://dk521123.hatenablog.com/entry/2024/07/24/120726

import ConfigType._

import scala.language.implicitConversions
import scala.util.{Failure, Success, Try}

sealedtrait ConfigType
object ConfigType {
  finalcaseclass ConfigString(str: String) extends ConfigType
  finalcaseclass ConfigInt(int: Int) extends ConfigType
  finalcaseclass ConfigBoolean(bool: Boolean) extends ConfigType
  finalcaseclass ConfigStrings(list: List[String]) extends ConfigType

  def toConfigType[T](value: T): ConfigType = {
    value match {
      case intValue: Int =>  ConfigInt(intValue)
      case boolValue: Boolean => ConfigBoolean(boolValue)
      case stringValue: String => ConfigString(stringValue)
      case listValues: List[String] => ConfigStrings(listValues)
      case _ => thrownew IllegalArgumentException("No supported")
    }
  }

  implicit class ConfigTypeEx(val self: ConfigType) {
    final def getValue[T]: T = {
      val value = self match {
        case ConfigString(str) => str
        case ConfigInt(int) => intcase ConfigBoolean(bool) => bool
        case ConfigStrings(list) => list
        case _ => thrownew IllegalArgumentException("Not Supported")
      }
      // ★asInstanceOf★
      value.asInstanceOf[T]
    }
  }

  implicit class OptionConfigTypeEx(val self: Option[ConfigType]) {
    def getValueOrElse[T](default: T): T = {
      // ★isInstanceOf★if (self.isDefined && self.get.isInstanceOf[ConfigType])
        Try(self.get.getValue[T]) match {
          case Failure(_) => default
          case Success(value) => value
        }
      else
        default
    }
  }
}

object Hello {
  def main(args: Array[String]): Unit = {
    val mapper: Map[String, Option[ConfigType]] = Map(
      "key1" -> Some(toConfigType("Hello")),
      "key2" -> Some(toConfigType(2)),
      "key3" -> Some(toConfigType(true)),
      "key4" -> Some(toConfigType(List("value4_1", "value4_2", "value4_3"))),
      "key5" -> None
    )

    mapper.foreach { case (key: String, value: Option[ConfigType]) =>
      if (value.isEmpty) {
        println(s"${key} - ${value.getValueOrElse[String]("NoneDefault")}")
        println(s"${key} - ${value.getValueOrElse[Int](123)}")
        println(s"${key} - ${value.getValueOrElse[Boolean](true)}")
        println(s"${key} - ${value.getValueOrElse[List[String]](List("NoneA", "NoneB"))}")
      } else {
        // ここで match 使ったら、意味ないけど、、、
        value.get match {
          // String -> key1 = value1case ConfigString(str) => println(s"${key} - ${value.getValueOrElse[String]("default")}")
          // Int -> key2 = 2case ConfigInt(int) => println(s"${key} - ${value.getValueOrElse[Int](193)}")
          // Boolean -> key3 = truecase ConfigBoolean(bool) => println(s"${key} - ${value.getValueOrElse[Boolean](true)}")
          // List[String] -> key4 = value4_1,value4_2,value4_3case ConfigStrings(list) => println(s"${key} - ${value.getValueOrElse[List[String]](List("C", "D"))}")
        }
      }
      println("******************")
    }
  }
}

出力結果例

key4 - List(value4_1, value4_2, value4_3)
******************
key5 - NoneDefault
key5 - 123
key5 - true
key5 - List(NoneA, NoneB)
******************
key1 - Hello
******************
key2 - 2
******************
key3 - true
******************

参考文献

https://xuwei-k.hatenablog.com/entry/20101103/1288766564

関連記事

Scala~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
Scala~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2023/01/24/000000
Scala~ 基本編 / トレイト ~
https://dk521123.hatenablog.com/entry/2023/09/10/204016
Scala~ 基本編 / パターンマッチング ~
https://dk521123.hatenablog.com/entry/2023/06/06/233614
Scala~ 基本編 / 例外処理 ~
https://dk521123.hatenablog.com/entry/2023/10/05/000135
ScalaEnum
https://dk521123.hatenablog.com/entry/2023/01/05/000000
Scala~ 代数的データ型 / ADT ~
https://dk521123.hatenablog.com/entry/2024/07/23/193246


Viewing all articles
Browse latest Browse all 7910

Trending Articles