scala中的Type使用

本文探讨了Scala中泛型类型的使用,特别是在模式匹配和类型转换中的应用。通过示例展示了如何在case class中使用泛型,以及如何进行类型安全的转换。同时,解释了在trait中定义子类类型并返回子类实例的方法。最后提到了在集合中处理类型参数的解决方案,利用scala.reflect.ManifestAPI来避免类型擦除问题。
摘要由CSDN通过智能技术生成
trait Base {
  val name: String  
}

case class S(
    name: String, 
    age: Int
) extends Base

case class F(
    name: String,
    tel: Long
) extends Base


case class Info[T <: Base](
   b: T,
   time: String                      
)

object Test extends App {
  override def main(String args): Unit = {
        val i = Info(F("Jim", 23212341), "15:15:30")
        
        i match {
           case info @ Info(b: F, time) => 
             println(s"F info: $info")

           case info @ Info(b: S, time) => 
             println(s"S info: $info")
 
        }     
    }          
}                                     

复制代码

一、scala 使用 generic 通用类型如何做模式匹配

上述的case class Info在模式匹配时,需要使用

           case info @ Info(b: S, time) =>

 代替传统的 

           case info:Info =>

如果用下面的,编译时会有警报

non variable type-argument String in type pattern String => _ is unchecked since it is eliminated by erasure

 

二、scala 如何返回某个基类trait的subClass or subType

还是以上面的例子讲解

如果我想返回F或者S,可以使用

 

def getSub[T <: Base](b: Base): T = {
  b.asInstanceOf[T]      
}

但是这里要注意,如果入参b不是我们想要的T类型,编译会有error

 

三、scala中的trait中引入一个superClass —— subClass,如何在这个trait中规定返回subClass的类型

复制代码

trait GoBase {
  type BB <: Base
     
  val b: BB
  
  def getBase(): BB = b
                      
}

class Go1 {
  override type BB = F
  
  val b = F("Tom", 9939122)               
}

object Test1 {
  val go = new Go1
  val b = go.getBase
  println(b.toString) //  F("Tom", 9939122)            
}

复制代码

 

 

四、scala中怎么在collection中获得类型参数

详细参考 https://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why-cant-i-get-the-type-paramete

 使用scala.reflect.Manifest API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值