我有如下的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 的子类型”
但我知道如何解决它。下面的 A
和 B
扩展了 ClassA
并实现了 InterfaceA
。
val someClass = SomeClass(A(), B())
有人可以帮忙解决这个问题吗?
最佳答案
您可以使用 where-clause定义多个上限:
class SomeClass<T>(a: T, b: T)
where T : ClassA, T : InterfaceA
<小时/>
更新,因为显然这不是问题所在。假设您有上面的代码(或原始 Java),以及 ClassB
继承/实现 T
所需的两种类型, ClassA
和InterfaceA
.
open class ClassA
interface InterfaceA
class ClassB : ClassA(), InterfaceA
创建 SomeClass
的实例如果您有a
和b
这是 T
类型从某个地方(例如,它们是 ClassB
的实例)然后看起来像这样:
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) {}
}
关于java - 我如何实例化一个像A : extends B implements C in kotlin这样的java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44626655/