为什么我的 Java List 不能转换为扩展 list 的接口? 我有一个定义列表类型的接口:
public interface RefInItemsListInput <T extends Object> extends List<T> {}
用于 3 个地方,并且将有一个构建者来制作它。 我有另一个接受 RefInItemsListInput 的类:
public static class RefInItems1 extends JsonSchema {
public static RefInItemsList validate(RefInItemsListInput arg, SchemaConfiguration configuration) throws ValidationException {
return JsonSchema.validateList(RefInItems1.class, arg, configuration);
}
}
我在测试中称之为:
@Test
public void testPropertyNamedRefValidPasses() {
// property named $ref valid
RefInItems.RefInItems1.validate(
(RefInItems.RefInItemsListInput)
Arrays.asList(
MapMaker.makeMap(
new AbstractMap.SimpleEntry<>(
"$ref",
"a"
)
)
),
configuration
);
}
我的 MapMaker 课程是:
/**
* A builder for maps that allows in null values
* Schema tests need this
* Future schema doc code samples will need it
*/
public class MapMaker {
@SafeVarargs
@SuppressWarnings("varargs")
public static <K, V> Map<K, V> makeMap(Map.Entry<K, V>... entries) {
Map<K, V> map = new HashMap<>();
for (Map.Entry<K, V> entry : entries) {
map.put(entry.getKey(), entry.getValue());
}
return map;
}
}
当我运行测试时,出现此错误:
java.lang.ClassCastException: class java.util.Arrays$ArrayList cannot be cast to class org.openapijsonschematools.client.components.schemas.RefInItems$RefInItemsListInput (java.util.Arrays$ArrayList is in module java.base of loader 'bootstrap'; org.openapijsonschematools.client.components.schemas.RefInItems$RefInItemsListInput is in unnamed module of loader 'app')
at org.openapijsonschematools.client.components.schemas.RefInItemsTest.testPropertyNamedRefValidPasses(RefInItemsTest.java:23)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
为什么我的 ArrayList 实例不能转换为扩展列表的接口? 我正在使用 Java 11
发生这种情况是因为从子类(List)转换为扩展类 该接口是List的扩展。解决方案是:
代码如下所示:
public interface NestedItemsListInput extends List<Object> {
class NestedItemsListInputImpl extends ArrayList<Object> implements NestedItemsListInput {
public NestedItemsListInputImpl(List<Object> inst) {
super(inst);
}
}
static NestedItemsListInput of(List<Object> inst) {
return new NestedItemsListInputImpl(inst);
}
}
测试代码为:
NestedItems.NestedItems1.validate(
NestedItems.NestedItemsListInput.of(
Arrays.asList(
Arrays.asList(
Arrays.asList(
Arrays.asList(
1
)
),
Arrays.asList(
Arrays.asList(
2
),
Arrays.asList(
3
)
)
),
Arrays.asList(
Arrays.asList(
Arrays.asList(
4
),
Arrays.asList(
5
),
Arrays.asList(
6
)
)
)
)),
configuration
);
一旦可以在这里阅读所有内容并查看其他一些解决方案: