为什么我的 Java ArrayList 不能转换为扩展 List 的接口?

问题描述 投票:0回答:1

为什么我的 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

java list arraylist interface
1个回答
0
投票

发生这种情况是因为从子类(List)转换为扩展类 该接口是List的扩展。解决方案是:

  1. 定义所需的类型作为List的扩展
  2. 创建一个实现该对象的类
  3. 使用列表输入创建步骤 2 中的类的新实例

代码如下所示:

    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
        );

一旦可以在这里阅读所有内容并查看其他一些解决方案:

© www.soinside.com 2019 - 2024. All rights reserved.