Scala之类型

本文介绍了Scala中的类型检查和转换方法,包括isInstanceOf和asInstanceOf的使用,以及如何通过classOf获取类模板。此外,还探讨了枚举类和应用类的概念,并讲解了如何使用type关键字定义新的类型。

一、类型检查和转换

  (1)obj.isInstanceOf[T]:判断obj是不是T类型。

        (2)obj.asInstanceOf[T]:将obj强转成T类型。

        (3)classOf获取类模板。

def main(args: Array[String]): Unit = {
    // 判断对象的类型  以及转换对象的类型
    // 只有多态会使用到
    val person1: Person = new Student
    person1.sayHi()

    // 想要调用子类独有的属性和方法  需要对其进行转换  转换为对应的子类才行
    val student1: Student = person1.asInstanceOf[Student]

    student1.sayHi()

    // 即使在多态中  也会存在多个子类  不能直接转换  需要先判断
    if (person1.isInstanceOf[Teacher]) {
      val teacher1: Teacher = person1.asInstanceOf[Teacher]
      teacher1.sayHi1()
    }

    // 调用固定的方法  返回类模板
    val value: Class[Student16] = classOf[Student16]
}

class Person {}

class Student extends Person {

  // 子类当中独有的属性和方法  使用多态无法调用
  def sayHi(): Unit = {
    println("hi")
  }
}

class Teacher extends Person {
  // 子类当中独有的属性和方法  使用多态无法调用
  def sayHi1(): Unit = {
    println("hi teacher")
  }
}

二、枚举类和应用类

        枚举类:需要继承Enumeration

        应用类:需要继承App

// 枚举类
object Color extends Enumeration {
  val RED: Color.Value = Value(1, "red")
  val GREEN = Value(2, "green")
}


// 应用类
object Application extends App {
  println("hello")
}

三、Type定义新类型

        使用type关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名

object Test {

    def main(args: Array[String]): Unit = {
        
        type S=String
        var v:S="abc"
        def test():S="qwer"
    }
}

### Scala 类型系统概述 Scala类型系统是一种强大的静态类型系统,它结合了面向对象编程和函数式编程的特性。类型系统的核心是 `Any` 类型,它是所有其他类型的父类[^1]。Scala类型系统分为两大类:值类型 (`AnyVal`) 和引用类型 (`AnyRef`)。 #### 1. 值类型 (`AnyVal`) 值类型表示基本的数据类型,如 `Int`, `Double`, `Char`, `Boolean` 等。这些类型在内存中直接存储值,而不是引用。它们继承自 `AnyVal` 类型。例如: ```scala val num: Int = 10 val pi: Double = 3.14 val isTrue: Boolean = true ``` #### 2. 引用类型 (`AnyRef`) 引用类型表示非基本数据类型,如类、特质(traits)、数组等。所有用户定义的类都继承自 `AnyRef` 类型。在 JVM 上运行时,`AnyRef` 等价于 Java 中的 `java.lang.Object`[^4]。例如: ```scala class Person(name: String, age: Int) val person: AnyRef = new Person("Alice", 30) ``` #### 3. 特殊类型 - **`Nothing`**:Scala 中的最底类型,没有任何值。通常用于表示不可能返回的函数或抛出异常的情况。 - **`Null`**:表示空引用,继承自所有引用类型的父类,但不继承自值类型[^4]。 ```scala def fail(): Nothing = throw new RuntimeException("Failed") val nullValue: Null = null ``` ### Scala 类型系统的高级特性 #### 单例类型 Scala 提供了单例类型的概念,允许将某个特定对象类型精确地表示出来。这使得链式调用成为可能[^2]。例如: ```scala class Counter { private var value = 0 def increment() = { value += 1; this } } val counter = new Counter() counter.increment().increment() ``` 这里 `this.type` 表示当前对象类型,确保每次调用返回的是同一个对象实例。 #### 泛型 Scala 的泛型支持比 Java 更加灵活,允许在编译时保留类型信息,而不需要像 Java 那样进行类型擦除[^3]。例如: ```scala def identity[T](x: T): T = x val strIdentity: String = identity("Scala") val intIdentity: Int = identity(42) ``` #### 类型构造器 类型构造器允许定义带有类型参数的抽象类型。例如: ```scala trait List[+A] class Nil extends List[Nothing] class Cons[+A](head: A, tail: List[A]) extends List[A] ``` ### Scala 类型系统的反射支持 从 Scala 2.10 开始,提供了 `scala.reflect.runtime.universe.Type` 来表示类型信息[^1]。通过反射,可以动态获取类型信息。例如: ```scala import scala.reflect.runtime.universe._ val mirror = runtimeMirror(getClass.getClassLoader) val clazz = mirror.staticClass("scala.collection.immutable.List") println(clazz.typeSignature) // 输出 List 类型签名 ``` ### 常用类型示例 以下是一些常用的 Scala 数据类型及其简单使用: ```scala // 值类型 var num1: Int = 10 var char1: Char = 'a' // 引用类型 var str: String = "Hello" var list: List[Int] = List(1, 2, 3) // 特殊类型 var nothing: Nothing = throw new Exception("Error") var nullable: Null = null ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值