我怎样才能实例java类像A:扩展B在kotlin中实现C.

我有这样的Java类:

public class SomeClass<T extends ClassA & InterfaceA> { public SomeClass(T a, T b) {} } class A extends ClassA implements InterfaceA{} class B extends ClassA implements InterfaceA{} 

我试图在下面的kotlin中创建SomeClass的一个实例,但我得到一个编译错误:

“感染类型Any!不是ClassA的子类型”

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

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

有人可以帮忙吗?

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

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

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

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

如果你有一个类型为Tab (例如,它们是ClassB的实例),创建一个SomeClass实例,如下所示:

 val a = ClassB() val b = ClassB() val someClass = SomeClass(a, b) 

包含类型参数的最后一行的长形式看起来像这样(但是类型参数大部分时间可以像上面所看到的那样推断出来):

 val someClass = SomeClass<ClassB>(a, b) 

再次编辑:

如果您需要传入与类型要求相匹配的不相关类的实例,则需要为SomeClass两个类型参数:

 public class SomeClass<T1 extends ClassA & InterfaceA, T2 extends ClassA & InterfaceA> { public SomeClass(T1 a, T2 b) {} } 

与Kotlin的多个上界一般是痛苦的。 也许这是一个bug,因为AB都是ClassAInterfaceA的子类,所以在java中没有问题。 但它可以通过为多上界泛型参数编写一个丑陋的方法来实现你的方式。 例如:

 val error = SomeClass(A(), B()); val ok = new(A(), B()); //star projection means: <? extends ClassA & InterfaceA> // | fun <F, S> 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的原始类型都是ClassAInterfaceA因此它在运行时工作正常,而type-in​​ference和type erasure只在编译时发生。