[TOC]
## 重載get操作符
```kotlin
/**
* public interface Context {
* public interface Key<E extends Element> {
* }
*
* @Nullable
* <E extends Element> E get(@NotNull Key<E> key);
*
* public interface Element extends Context {
* @NotNull
* Key<?> getKey();
*
* @Override // org.example.Context
* @Nullable
* <E extends Element> E get(@NotNull Key<E> key);
*
* public static final class DefaultImpls {
* @Nullable
* public static <E extends Element> E get(@NotNull Element element, @NotNull Key<E> key) {
* Intrinsics.checkNotNullParameter(key, "key");
* if (!Intrinsics.areEqual(element.getKey(), key)) {
* return null;
* }
* Intrinsics.checkNotNull(element, "null cannot be cast to non-null type E of org.example.Context.Element.get");
* return element;
* }
* }
* }
* }
*/
interface Context {
public operator fun <E : Element> get(key: Key<E>): E?
public interface Key<E : Element>
public interface Element : Context {
public val key: Key<*>
public override operator fun <E : Element> get(key: Key<E>): E? =
@Suppress("UNCHECKED_CAST")
if (this.key == key) this as E else null
}
}
/**
* public interface ITask extends Context.Element {
*
* @NotNull
* public static final Key Key = Key.$$INSTANCE;
*
* void test();
*
* public static final class DefaultImpls {
* @Nullable
* public static <E extends Context.Element> E get(@NotNull ITask iTask, @NotNull Context.Key<E> key) {
* Intrinsics.checkNotNullParameter(key, "key");
* return (E) Context.Element.DefaultImpls.get(iTask, key);
* }
* }
*
* /* compiled from: Main.kt */
* /* loaded from: ITask$Key.class */
* public static final class Key implements Context.Key<ITask> {
* static final /* synthetic */ Key $$INSTANCE = new Key();
*
* private Key() {
* }
* }
* }
*/
public interface ITask : Context.Element {
// compaion object 伴生對象,可以是接口,提供默認實現
public companion object Key : Context.Key<ITask>
fun test()
}
/**
* public final class Test implements ITask {
* @Override // org.example.Context.Element, org.example.Context
* @Nullable
* public <E extends Context.Element> E get(@NotNull Context.Key<E> key) {
* return (E) ITask.DefaultImpls.get(this, key);
* }
*
* @Override // org.example.ITask
* public void test() {
* System.out.println((Object) "call test");
* }
*
* @Override // org.example.Context.Element
* @NotNull
* public Context.Key<?> getKey() {
* return ITask.Key;
* }
* }
*/
class Test : ITask {
override fun test() {
println("call test")
}
override val key: Context.Key<*> get() = ITask
}
/**
* public final class MainKt {
* public static final void main() {
* Context test = new Test();
* ITask iTask = (ITask) test.get(ITask.Key);
* if (iTask != null) {
* iTask.test();
* }
* }
* }
*/
fun main() {
val test: Context = Test()
test[ITask]?.test() // 等價于(test.get(ITask) as? ITask)?.test()
}
```
- 寫在前面的話
- Java
- 基礎
- Double的比較
- 小數怎么用二進制表示
- 多線程
- 并發和并行
- 線程池
- 線程池背景
- 線程池構造
- 任務阻塞隊列
- Flutter
- 基礎知識
- Dart基礎
- Android
- 項目架構
- View
- 非UI線程更新View
- AlarmManager
- 對比postDelaryed和Timer
- Bitmap
- 加載100M的圖片卻不撐爆內存
- Bitmap壓縮
- Bitmap局部解碼
- 計算圖片的內存占用
- Android動畫
- Android動畫類型
- Android動畫原理
- 屬性動畫
- 幀動畫
- 補間動畫
- 使用動畫的注意事項
- Android新特性
- 權限組
- Android23(Marshmallow)-6.0
- Android24(Nougat)-7.0
- Android26(Oreo)-8.0
- Android28(Pie)-9.0
- Android29(Q)-10.0
- AndroidX遷移
- Kotlin
- 關鍵字
- Kotlin操作符
- CoroutineScope
- Flow
- CoroutineException