// 自定义Calculable接口
interface Calculable
// 泛型接口DataProcessor,T有多个上界约束
interface DataProcessor<T : Number & Calculable> {
fun process(): Number
}
// 泛型类ProcessorImpl实现DataProcessor接口,U满足in变型
class ProcessorImpl<in U : Number & Calculable> : DataProcessor<U> {
override fun process(): Number {
return when (U::class) {
Int::class -> {
(this as? ProcessorImpl<Int>)?.let {
// 这里假设存在两个Int值进行加法计算
val num1 = 10
val num2 = 20
num1 + num2
}?: 0
}
Double::class -> {
(this as? ProcessorImpl<Double>)?.let {
// 这里假设存在两个Double值进行乘法计算
val num1 = 10.0
val num2 = 20.0
num1 * num2
}?: 0.0
}
else -> 0
}
}
}
in
变型在此处的意义及使用场景
- 意义:
in
变型表示逆变。在ProcessorImpl<in U>
中,U
是逆变类型参数。这意味着ProcessorImpl
可以接受U
及其所有子类型作为参数类型。例如,如果有ProcessorImpl<Number>
,那么也可以使用ProcessorImpl<Int>
或ProcessorImpl<Double>
,因为Int
和Double
都是Number
的子类型。
- 使用场景:当泛型类主要用于消费(接收参数)而不是生产(返回值)泛型类型的数据时,适合使用
in
变型。在上述代码中,ProcessorImpl
类中的process
方法并没有返回与U
类型相关的特定值,而是返回Number
类型的值,这符合消费泛型类型数据的场景。使用in
变型增强了代码的灵活性和可复用性,允许在需要ProcessorImpl<Number>
的地方传入ProcessorImpl<Int>
或ProcessorImpl<Double>
等具体实现。