1

我正在为泛型中的值类以及与 Java 或 Groovy 的互操作性而苦苦挣扎。值类是内联的:内联类 | Kotlin 1 除了泛型。

给定以下值类和接口(Kotlin):

@JvmInline
value class ValueClass(val id: String)

interface ValueClassListProvider {
    @Suppress("INAPPLICABLE_JVM_NAME")
    @JvmName("values")
    fun values(): List<ValueClass>

    @Suppress("INAPPLICABLE_JVM_NAME")
    @JvmName("value")
    fun value(): ValueClass
}

如何在 Java 或 Groovy 中实现 ValueClassListProvider 接口?

class ValueClassListProviderImplJava implements ValueClassListProvider {
    public List<ValueClass> values() {
        return Arrays.asList(new ValueClass("1"));
    }

    public String value() {
        return "1";
    }
}

尝试运行以下代码:

public static void main(String[] args) {
    ValueClassListProviderImplJava provider = new ValueClassListProviderImplJava();
    System.out.println(provider.values());
}

导致:

java: cannot find symbol
  symbol:   constructor ValueClass(java.lang.String)
  location: class pl.test.valueclass.ValueClass

对于 ValueClassListProvider 接口的 Groovy 实现:

class ValueClassListProviderImplGroovy implements ValueClassListProvider {

    List<String> values() {
        return ["1", "2"]
    }

    String value() {
        return "1"
    }
}

它可以编译并且似乎可以工作,但是当这个实现后来在 Kotlin 代码中使用时(假设这是在 spock 测试中使用的存根),它吹了:

java.lang.ClassCastException: class java.lang.String cannot be cast to class pl.test.valueclass.ValueClass

是否可以在 Java 或 Groovy 中创建值类的实例(泛型需要)?

4

0 回答 0