Tag: 代表团

直接在代表中设置并获取属性

我想设置和获取属性传递给这样的委托(或者我应该维护委托本身的状态?): class Example { var p: String by Delegate() } class Delegate() { operator fun getValue(thisRef: Any?, prop: KProperty<*>): String { if (prop/*.getValueSomehow()*/){ //<=== is this possible } else { prop./*setValueSomehow("foo")*/ return prop./*.getValueSomehow()*/ //<=== is this possible } } operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { prop./*setValueSomehow(someDefaultValue)*/ //<=== is this possible } }

Kotlin:我怎样才能得到一个成员财产的代表团类?

我怎样才能得到一个成员属性的委托类? 通过这个,我的意思是有可能完成这样一个功能: inline fun <reified T> delegationExample(t: T) { for (prop in T::class.declaredMemberProperties) { val delegatedClass = // what to do?! } } 代表团可能看起来像这样: class DelegationExample { operator fun getValue(ref: Any, prop: KProperty<*>) = 0 } 而声明类可能是这样的: object Example { val a by DelegationExample() val b by DelegationExample() val c by DelegationExample() }

Kotlin – 如何使用自定义名称制作地图代理?

我试图让我的头绕着财产代表,我有一个有趣的用例。 有没有可能有这样的事情: class MyClass { val properties = mutableMapOf<String, Any>() val fontSize: Any by MapDelegate(properties, "font-size") } 这将允许我使用地图作为fontSize存储fontSize ,但使用自定义键(即“font-size”)。 如果用于存储诸如可以通过变量( fontSize )访问的用于代码的CSS属性标记的特定用例,但是在遍历地图( font-size: 18px; )时可以正确渲染。

为什么只有接口可以委托给kotlin?

我看到过几个类似的问题,但没有一个解释为什么委托仅限于接口? 实际上大多数情况下,我们有一些实际上没有任何接口的东西,它是一个实现了一些功能或者实现一个抽象类的类。 是否有任何根本性的限制,迫使它仅限于接口,或者我们可以期望科林在将来有无限制的授权? 如果我们想使用组合不继承来扩展类的功能,这是特别有用的。 class A {} class B(val a: A) : A by a {}

Kotlin班级代表团的意外行为

据我所知,班级代表团应该是这样的 允许对象组合实现与继承一样的代码重用。 [维基百科] Kotlin支持类授权,并注意以下声明形式的文档 : 覆盖你所期望的工作:编译器将使用你的覆盖实现,而不是委托对象中的那些。 考虑到这一点,请考虑以下最简单的例子: interface A { val v: String fun printV() { Logger.getLogger().info(Logger.APP, "A", v) } } class AImpl : A { override val v = "A" } class B(a: A) : A by a { override val v: String = "B" } 我期望B(AImpl()).printV()会打印B ,但是它打印A ,即它使用AImpl的默认实现。 此外,如果我使用super实现覆盖B中的printV()方法,即 class B(a: A) : […]

我怎样才能得到Kotlin物业的名字?

我有以下功能访问属性的代表。 它使用Kotlin反射来获得一个属性的名称和Java反射来获得该字段。 fun Any.getDelegate<T>(prop: KProperty<T>): Any { return javaClass.getDeclaredField("${prop.name}\$delegate").let { it.setAccessible(true) it.get(this) } } 该方法是这样使用的: val delegate = a.getDelegate(A::b) 不过,我宁愿像这样使用它: val delegate = abdelegate 上面代码的问题是获取ab的属性名称并从ab获取实例。 根据我对Kotlin的了解,这可能是不可能的,但是我想看看我是否可以清理我的功能。 为了更全面地了解我正在尝试做什么,这里是我的完整代码。 我想要一个可观察的委托,我可以添加和删除观察员使用委托参考,而不创建额外的变量。 fun Any.addObservable<T>(prop: KProperty<T>, observer: (T) -> Unit) { getObservableProperty(prop).observers.add(observer) } fun Any.getObservableProperty<T>(prop: KProperty<T>): ObservableProperty<T> { return getDelegate(prop) as ObservableProperty<T> } fun Any.getDelegate<T>(prop: KProperty<T>): Any { return javaClass.getDeclaredField("${prop.name}\$delegate").let […]

Kotlin:我如何在Java中使用委托属性?

我知道你不能在Java中使用委托属性语法,也不会像Kotlin那样获得“覆盖”set / get操作符的方便,但是我仍然想使用Java中的现有属性委托。 例如,一个简单的int代理: class IntDelegate { operator fun getValue(thisRef: Any?, property: KProperty<*>) = 0 } 在Kotlin当然我们可以这样使用: val x by IntDelegate() 但是我们怎样才能在Java中以某种形式使用IntDelegate呢? 我相信这是开始 final IntDelegate x = new IntDelegate(); 然后直接使用函数。 但是我怎样才能使用getValue函数呢? 我通过什么参数? 我如何获得Java领域的KProperty ?

kotlin grpc.StreamObserver去rx.PublishSubject

每当我们声明流API时使用GRPC rpc heartBeat(Empty) returns (stream ServiceStatus){} 我们已经为观察者模式StreamObserver简单的接口(这是protobuf会为我们生成的) public interface StreamObserver<V> { void onNext(V var1); void onError(Throwable var1); void onCompleted(); } 现在你想要做的就是将其转换为一个实际的Observable并且只有在它被传递之后才能继续使用。 override fun heartBeat(arg: Empty): Observable<ServiceStatus> { // we create rx java subject val subject = PublishSubject.create<ServiceStatus>() // we create grpc observer and delegate all calls to rx java val observer = object : StreamObserver<ServiceStatus> […]

Kotlin:功能委派

我有一个项目,很大程度上取决于Kotlin的授权和组成。 委托属性是一件轻而易举的事情,但从概念上说,我不完全确定如何在函数依赖于其他组合属性的情况下实现委托。 我想要做这样的事情: interface A { val a: String } class AImpl: A { override val a = "a" } interface B { val b: String } class BImpl: B { override val b = "b" } interface C<T> where T: A, T: B { fun c() : String } class CImpl<T>(val ab: T) : […]