我怎样才能实例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”

但我知道如何解决它。 下面的AB扩展了ClassA并实现了InterfaceA

 val someClass = SomeClass(A(), B()) 

有人可以帮忙吗?

您可以使用where子句来定义多个上限:

 class SomeClass(a: T, b: T) where T : ClassA, T : InterfaceA 

更新,因为显然这不是问题。 假设您有上面的代码(或原始的Java),并且inheritance/实现了TClassAInterfaceA所需的两种types的ClassB

 open class ClassA interface InterfaceA class ClassB : ClassA(), InterfaceA 

如果你有一个types为Tab (例如,它们是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,因为AB都是ClassAInterfaceA的子类,所以在java中没有问题。 但它可以通过为多上界generics参数编写一个丑陋的方法来实现你的方式。 例如:

 val error = SomeClass(A(), B()); val ok = new(A(), B()); //star projection means:  // | 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 ---^ } 

在上面的代码中没有问题,因为FS的原始types都是ClassAInterfaceA因此它在运行时工作正常,而type-in​​ference和type erasure只在编译时发生。