作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设,您有两个类 TestA 和 TestB。假设 TestA 扩展了 TestB:
public class TestB {
private int intProp;
public int getIntProp() {
return intProp;
}
public void setIntProp(int intProp) {
this.intProp = intProp;
}
}
public class TestA extends TestB {
private String strProp;
public String getStrProp() {
return strProp;
}
public void setStrProp(String strProp) {
this.strProp = strProp;
}
}
var getter1: KFunction1<TestA, Int> = TestA::getIntProp
var getter2: KFunction1<TestA, Int> = TestB::getIntProp
最佳答案
这是generics variance in Kotlin ,其目的是将类型安全的层次结构强加于具有类层次结构本身中的参数的泛型类。
类(class)KFunction1
具有定义为 <in P1, out R>
的通用参数, P1
与 in
修饰符和 R
与 out
修饰符。这意味着将有:
P1
由 in
介绍修饰符。KFunction1<PSuper, R>
将是 KFunction1<P, R>
的子类型如果 PSuper
是 P
的父类(super class)型.但是会增加限制,即P1
只能作为(传入)KFunction1
的参数出现的成员。R
由 out
介绍修饰符。KFunction1<P, RSub>
将是 KFunction1<P, R>
的子类型如果 RSub
是 R
的子类型.在这里R
将受到限制:它只能用作 KFunction1
的返回值(传递出去)的成员。KFunction1<PSuper, RSub>
到
KFunction1<P, R>
类型的变量.
KFunction1
有意义,因为任何接收类型为
PSuper
的参数的函数也可以接收
P
的实例(但反之亦然),以及任何返回
RSub
实例的函数同时返回
R
的实例(但反之则不然)。
class Invariant<T> {
fun f(i: Int): T { throw Exception() } // OK
fun f(t: T): Int { throw Exception() } // OK
}
class Contravariant<in T> {
fun f(i: Int): T { throw Exception() } // error, T cannot be returned
fun f(t: T): Int { throw Exception() } // OK, T is parameter type
}
class Covariant<out T> {
fun f(i: Int): T { throw Exception() } // OK, T is returned
fun f(t: T): Int { throw Exception() } // error, T cannnot be parameter type
}
open class Base
class Derived: Base()
val i1: Invariant<Base> = Invariant<Derived>() // error
val i2: Invariant<Derived> = Invariant<Base>() // error
val n1: Contravariant<Base> = Contravariant<Derived>() // error
val n2: Contravariant<Derived> = Contravariant<Base>() // OK
val v1: Covariant<Base> = Covariant<Derived>() // OK
val v2: Covariant<Derived> = Covariant<Base>() // error
关于generics - KFunction1 中的 kotlin 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36155108/
class X { fun someFunc(x: Int, y: String, z: Double) { println("x = [$x], y = [$y], z =
我正在尝试获取定义函数的名称 fun aFunction() = Unit fun functionName(function: () -> Unit) : String { val functi
以下内容无法编译: fun doSomething(value: T, action: (value: T) -> String = Any::toString){ //do something
我正在使用 Kotlin + Retrofit + Rx。我想将其中一个请求提取到函数中: fun getDataAsync(onSuccess: Consumer, onError: Consume
我是一名优秀的程序员,十分优秀!