java - 我如何实例化一个像A : extends B implements C in kotlin这样的java类

标签 java generics kotlin

我有如下的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-clause定义多个上限:

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

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

open class ClassA
interface InterfaceA

class ClassB : ClassA(), InterfaceA

创建 SomeClass 的实例如果您有ab这是 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/

相关文章:

java - 如何使用 Java 6 针对 Java 1.4 库构建 Java 项目?

java - 如何在 Training ImageLoader 中用 png 加载前 100 个字符

c# - 如何知道类型参数是否是动态的?

java - Spring IoC 和通用接口(interface)类型实现

for-loop - 如何在 Kotlin 中以数组索引作为起点/终点进行反向 for 循环?

Java 服务器端应用程序,如何?

java - 如何在不双重实例化 JFrame 的情况下更改图像?

asp.net-mvc - 为什么映射对象 PK 会破坏 ExpressMapper?

android - 如何为小米、红米、三星、华为等创建Android虚拟设备AVD

android - 在 Jetpack Compose 中创建 "nested"菜单的更好或更简单的方法是什么?