目录
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 : " + (name, name1);
boolean var5 = false;
(var4);
var4 = "myFile==myFile1 : " + (myFile, myFile1);
var5 = false;
(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> = <E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = <K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = <K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = <E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = <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 = "小子";
(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 =
// Function Types (函数类型)
typealias ClickHandler = (View) -> Unit
// Lambda with Receiver (带接收者的Lambda)
typealias IntentInitializer = Intent.() -> Unit
// Nested Classes and Interfaces (嵌套类和接口)
typealias NotificationBuilder =
typealias OnPermissionResult =
// Enums (枚举类)
typealias Direction =
// (but you cannot alias a single enum *entry*)
// Annotation (注解)
typealias Multifile = JvmMultifileClass