我怎样才能实例java类像A:扩展B在kotlin中实现C.
我有这样的Java类:
public class SomeClass { public SomeClass(T a, T b) {} } class A extends ClassA implements InterfaceA{} class B extends ClassA implements InterfaceA{}
我试图在下面的kotlin中创建SomeClass的一个实例,但我得到一个编译错误:
“感染typesAny!不是ClassA的子types”
但我知道如何解决它。 下面的A
和B
扩展了ClassA
并实现了InterfaceA
。
val someClass = SomeClass(A(), B())
有人可以帮忙吗?
您可以使用where子句来定义多个上限:
class SomeClass(a: T, b: T) where T : ClassA, T : InterfaceA
更新,因为显然这不是问题。 假设您有上面的代码(或原始的Java),并且inheritance/实现了T
, ClassA
和InterfaceA
所需的两种types的ClassB
。
open class ClassA interface InterfaceA class ClassB : ClassA(), InterfaceA
如果你有一个types为T
的a
和b
(例如,它们是ClassB
的实例),创建一个SomeClass
实例,如下所示:
val a = ClassB() val b = ClassB() val someClass = SomeClass(a, b)
包含types参数的最后一行的长forms看起来像这样(但是types参数大部分时间可以像上面所看到的那样推断出来):
val someClass = SomeClass(a, b)
再次编辑:
如果您需要传入与types要求相匹配的不相关类的实例,则需要为SomeClass
两个types参数:
public class SomeClass { public SomeClass(T1 a, T2 b) {} }
与Kotlin的多个上界一般是痛苦的。 也许这是一个bug,因为A
和B
都是ClassA
和InterfaceA
的子类,所以在java中没有问题。 但它可以通过为多上界generics参数编写一个丑陋的方法来实现你的方式。 例如:
val error = SomeClass(A(), B()); val ok = new(A(), B()); //star projection means: extends ClassA & InterfaceA> // | fun new(first: F, second: S): SomeClass<*> where F : ClassA, F : InterfaceA, S : ClassA, S : InterfaceA { @Suppress("UNCHECKED_CAST") return SomeClass(first,second as F); // it is always ok ---^ }
在上面的代码中没有问题,因为F
和S
的原始types都是ClassA
和InterfaceA
因此它在运行时工作正常,而type-inference和type – erasure只在编译时发生。