Kotlin-18- typealias(类型映射)

2022-07-08 14:17:40

目录

1、定义

2、映射类型编译成class之后

3、Kotlin中对typealias的应用

4、注意


1、定义

typealias关键字的作用就是将一个类映射到另一个类上面,或者可以说是给一个类起个别名。

从下面的代码我们可以看出,我String 这个类映射到了A这个类上面,然后分别用A和String创建两个对象,比较输出的结果是相等的。

public typealias A = String
public typealias B = File

fun main() {
    val name: A = "ZhangSan"
    val name1: String = "ZhangSan"
    val myFile = B("myPath")
    val myFile1 = File("myPath")

    println("name==name1 : ${name == name1}")
    println("myFile==myFile1 : ${myFile == myFile1}")
}
//输出结果
name==name1 : true
myFile==myFile1 : true

2、映射类型编译成class之后

下面的代码是我们1、定义里边的代码,编译成class文件之后,我们可以看到,我们映射的A类型已经自动还原为了String类型,从这里我们可以得到:

typealias关键字不会创建一个新的类型,只是给该类取了一个别名,编译运行的时候还会还原成原来的类型。

public final class TestMainKt {
   public static final void main() {
      String name = "ZhangSan";
      String name1 = "ZhangSan";
      File myFile = new File("myPath");
      File myFile1 = new File("myPath");
      String var4 = "name==name1 : " + Intrinsics.areEqual(name, name1);
      boolean var5 = false;
      System.out.println(var4);
      var4 = "myFile==myFile1 : " + Intrinsics.areEqual(myFile, myFile1);
      var5 = false;
      System.out.println(var4);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

3、Kotlin中对typealias的应用

Kotlin中很多集合类都应用了typealias关键字将Java中的集合类映射过来,这样做到好处的是将来我们对这些集合类,就比如ArrayList做kotlin特有优化的时候,我们就可以直接在Kotlin中对其进行优化,而不需要再去兼容Java。

第二个好处就是平台的兼容性,我们知道Kotlin语言不仅仅可以运行在JVM平台上,还可以编译成JS展示,或者作为后台开发语言,这样我们可以在不同的平台调用自己映射优化的ArrayList类。

@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>

4、注意

  • typealias的映射类只能定义在Kotlin文件内,而不能定义在类中或者方法中。
  • 对于Kotlin中映射类型,在Java中是无法调用的,我们只能调用它的原始类型来和映射类型进行交互。
//Kotlin中的代码
public typealias A = String

fun sayNewString(msg:A){
    println("msg=$msg")
}
fun main() {
    val msg: A = "小子"
    sayNewString(msg)
}
//Java中的代码
public class TestTypeAlias {
    public static void main(String[] args) {
//      A msg = "小子";  会报错
        String msg = "小子";
        TestMainKt.sayNewString(msg);
    }
}

5、typealias的其他应用场景

// Classes and Interfaces (类和接口)
typealias RegularExpression = String
typealias IntentData = Parcelable
 
// Nullable types (可空类型)
typealias MaybeString = String?
 
// Generics with Type Parameters (类型参数泛型)
typealias MultivaluedMap<K, V> = HashMap<K, List<V>>
typealias Lookup<T> = HashMap<T, T>
 
// Generics with Concrete Type Arguments (混合类型参数泛型)
typealias Users = ArrayList<User>
 
// Type Projections (类型投影)
typealias Strings = Array<out String>
typealias OutArray<T> = Array<out T>
typealias AnyIterable = Iterable<*>
 
// Objects (including Companion Objects) (对象,包括伴生对象)
typealias RegexUtil = Regex.Companion
 
// Function Types (函数类型)
typealias ClickHandler = (View) -> Unit
 
// Lambda with Receiver (带接收者的Lambda)
typealias IntentInitializer = Intent.() -> Unit
 
// Nested Classes and Interfaces (嵌套类和接口)
typealias NotificationBuilder = NotificationCompat.Builder
typealias OnPermissionResult = ActivityCompat.OnRequestPermissionsResultCallback
 
// Enums (枚举类)
typealias Direction = kotlin.io.FileWalkDirection
// (but you cannot alias a single enum *entry*)
 
// Annotation (注解)
typealias Multifile = JvmMultifileClass
  • 作者:我要看一下山顶的风景
  • 原文链接:https://blog.csdn.net/qq_34589749/article/details/103646995
    更新时间:2022-07-08 14:17:40