泛型来源
- before JDK 1.5 -> 没有泛型功能,List可以存储任意数据结构,需要手进行强转;
- JDK 1.5 -> 引入泛型;
泛型实现
泛型实际通过类型擦除机制实现;
类型擦除机制:泛型对于类型的约束只存在与编译时期,而运行时期仍旧可以以Object形式存在的。比如ArrayList在运行时候只是用ArrayList来运行,只不过在读取的时候将Object转换为String
存在问题:List 无法判断list里面 is T或者list is List;
kotlin 优化
- inline内联函数: 将内联函数的函数直接复制到被调用的地方,反编译代码不存在新的函数;【其他则是以新函数的形象存在的】
fun test() {
var testVar = "Test"
notInlined { testVar }
inlined { testVar }
}
反编译后:
public static final void test() {
final ObjectRef testVar = new ObjectRef();
testVar.element = "Test Variable";
// notInlined:
notInlined((Function0)(new Function0(0) {
public Object invoke() {
return this.invoke();
}
@NotNull
public final String invoke() {
return (String)testVar.element;
}
}));
// inlined:
String var3 = (String)testVar.element;
System.out.println(var3);
- reified: 使抽象的东西更加具体或真实,需要结合inline使用;
inline fun <reified T, V> test(t: T, v: V) {
val c = T::class.java //编译成功
val c1 = V::class.java //编译失败
}
Tips
startActivity的抽象化方法
- 初始版本
inline fun<reified T : Activity> startActivity(context: Context) {
val intent = Intend(context, T::class.java)
context.startActivity(intend)
}
// 调用
startActivity<TargetActivity>(context)
- 带数据版本
inline fun<reified T : Activity> startActivity(context: Context, block: Intent.() -> Unit) {
val intent = Intend(context, T::class.java)
block()
context.startActivity(intend)
}
|