Android面试题之Java 泛型和Kotlin泛型

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

定义:JDK5引入的一种参数化类型特性

继承和实现接口可以多个
static class A{
   
   }
static interface B{
   
   }
static interface C{
   
   }

//类必须在接口的前面
static class D<T extends A & B & C>{
   
   }
泛型原理

泛型擦除:

  • 做类型检查,T如果有做类型限制,会转化为第1种限制,否则会擦除为object
  • 生成桥方法,里面调用对应的接口方法,调用的时候会进行类型的强转,转为T的限制类型
  • 泛型擦除后,字节码中没有泛型信息了,但是类的常量池里保留了泛型信息。反射的时候提供了一套API可以拿到,比如getGenericType()
泛型带来的问题
  1. 泛型类型变量不能使用基本类型
比如没有ArrayList<int>,只有ArrayList<Integer>,
当泛型擦除后,ArrayList的原始类中的类型变量T替换成了Object,但Object不能存放基本数据类型
  1. 不能使用instanceof运算符
因为泛型擦除后,ArrayList<String>只剩下原始类型,泛型信息String不存在了
  1. 泛型在静态方法和静态类中的问题

    因为泛型类中的泛型参数的实例化是在定义泛型类型对象时候指定的,而静态成员是不需要使用对象来调用的,所有对象都没创建,无法

### KotlinJavaAndroid开发中的面试题汇总 #### 1. KotlinJava的关系及互操作性 Kotlin是一门现代编程语言,与Java一样编译成字节码后运行在JVM上[^1]。两者可以无缝互操作,开发者可以在Kotlin代码中调用Java代码,也可以在Java代码中调用Kotlin代码。这种互操作性使得开发者可以根据项目需求逐步引入Kotlin代码。 #### 2. Kotlin数据类的特点 Kotlin的数据类通过`data`关键字声明,自动生成`equals()`、`hashCode()`、`toString()`、`copy()`以及`componentN()`等方法[^3]。这些特性显著减少了样板代码的编写,提高了开发效率。例如,定义一个简单的数据类如下: ```kotlin data class User(val name: String, val age: Int) ``` 上述代码会自动为`User`类生成必要的方法。 #### 3. KotlinJava的区别 Java是伪机制,在编译期擦除了所有信息,最终所有的都转化为原始类[^2]。而Kotlin则更加灵活,支持协变(`out`)逆变(`in`)修饰符,允许更精确地控制类参数的行为[^2]。例如: ```kotlin class Box<out T>(val value: T) // 协变 fun <T> copy(from: MutableList<in T>, to: MutableList<T>) {} // 逆变 ``` #### 4. Kotlin协程的基本概念 Kotlin协程通过`GlobalScope.launch`或`async`/`await`等方式实现异步任务管理[^3]。以下是一个简单的协程示例: ```kotlin GlobalScope.launch { delay(1000L) println("World!") } println("Hello,") ``` 上述代码展示了如何使用协程延迟执行任务,并通过`delay`模拟异步操作。 #### 5. 密封类的应用场景 密封类用于限制类的继承关系,确保只有特定的子类可以继承密封类[^4]。结合`when`表达式时,IDE可以智能补全所有可能的分支,避免遗漏。例如: ```kotlin sealed class Result<out T : Any> { data class Success<out T : Any>(val data: T) : Result<T>() sealed class Error(val exception: Exception) : Result<Nothing>() { class RecoverableError(exception: Exception) : Error(exception) class NonRecoverableError(exception: Exception) : Error(exception) } object InProgress : Result<Nothing>() } ``` #### 6. Kotlin中`@JvmOverloads`的作用 `@JvmOverloads`注解用于为Kotlin函数生成多个重载版本,以便Java代码能够方便地调用这些函数。例如: ```kotlin @JvmOverloads fun example(a: Int = 1, b: String = "default") {} ``` 上述代码会在Java端生成两个重载版本:`example(int a)``example(int a, String b)`。 #### 7. 面试题总结 - **数据类**:什么是Kotlin的数据类?它有什么特点? - ****:JavaKotlin的主要区别是什么? - **协程**:如何使用Kotlin协程实现异步任务? - **密封类**:密封类的作用及其在`when`表达式中的优势是什么? - **互操作性**:KotlinJava如何实现互操作? --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值