risc-v中文社区

 找回密码
 立即注册
查看: 1213|回复: 0

[原创] scala抽象类型

[复制链接]

5

主题

8

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2021-7-28 17:00:20 | 显示全部楼层 |阅读模式
class Food
abstract class Animal{
  type SuitableType <: Food
  def eat(t:SuitableType):Unit
}
class Grass extends Food
class Fish extends Food
class  Cow extends Animal(){
  override type SuitableType = Grass //关于scala中this.type作用及使用例子参考 http://www.javashuo.com/article/p-ayhpyeco-ek.htmlhttps://blog.csdn.net/javastart/article/details/50651538

  //  override def eat(t: Cow.this.type): Unit = println("cow eat grass")
  override def eat(t: SuitableType): Unit = println("cow eat grass " + getClass.getTypeName)  //此处不用原来Animal的eat(t:SuitableType而改为具体类型Grass
}
object AbstractTypeTest{
  def main(args: Array[String]): Unit = { //https://my.oschina.net/aiguozhe/blog/35964?catalog=115675
    val cow = new Cow
    val grass = new Grass
    val bessy:Animal = new Cow
    val bc = bessy.asInstanceOf[Cow] //asInstanceOf[cow]
    type grasstype = cow.SuitableType  //我们平常都是val/var z = new ...或Xclass(xxx)这种apply形式,这是我第一次用type来定义类型别名
    cow.eat(new grasstype) //cow eat grass scala.joe.com.implicits.Cow
    val g = new grasstype
    val g2 = new cow.SuitableType
    val cow2 = new Cow
    val g3 = new cow2.SuitableType
    cow2.eat(g) //cow eat grass scala.joe.com.implicits.Cow
    cow2.eat(g2) //cow eat grass scala.joe.com.implicits.Cow
    cow2.eat(g3) //cow eat grass scala.joe.com.implicits.Cow
    def getType[T:TypeTag](x:T) = typeOf[T] //ClassTagManifestTypeTag.scala中有这个函数
    println(getType(g) == typeOf[cow.SuitableType]) //fasle
    println(getType[g.type](g)) //g.type  //本句和下一句打印出来的信息要细看:也就是说要看typeOf[T]及其typeSymbol和getClass的不同
    println(getType(g).typeSymbol.fullName + "    " + getType(g).getClass) //scala.joe.com.implicits.Grass    class scala.reflect.internal.Types$ClassNoArgsTypeRef
    println(typeOf[cow.SuitableType]) //cow.SuitableType
//    println(typeOf[grasstype] == typeOf[cow.SuitableType]) //针对typeOf[grasstype]编译时出现:No TypeTag available for grasstype
//    println(typeOf[grasstype] == typeOf[cow2.SuitableType])//编译时出现:No TypeTag available for grasstype
//    println(typeOf[grasstype].termSymbol.fullName + "   " + typeOf[grasstype].getClass.getName)//编译时出现:No TypeTag available for grasstype
//    println(typeOf[grasstype.type ].termSymbol.fullName + "   " + typeOf[grasstype.type ].getClass.getName) //如果写成typeOf[grasstype.type]则出现:Cannot resolve symbol grasstype
    //也就是说typeOf[不能出现type定义的别名类型,只能出现实际类型或cow.SuitableType即某个实例变量.抽象类型的具体实现类型
    println(typeOf[cow.SuitableType].termSymbol.fullName + "   " + typeOf[cow.SuitableType].getClass.getName) //为什么上面typeOf[grasstype]编译错误而typeOf[cow.SuitableType]即OK??????? <none>   scala.reflect.internal.Types$AliasNoArgsTypeRef
    println(typeOf[cow2.SuitableType].termSymbol.fullName + "   " + typeOf[cow2.SuitableType].getClass.getName) //<none>   scala.reflect.internal.Types$AliasNoArgsTypeRef

  }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 20:20 , Processed in 0.013718 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表