0

我尝试通过使用 JDK17 Preview 的类来获得一个 switch case。

    sealed class A permits X,Y{}
    final class X extends A{}
    final class Y extends A{}

    public static <T extends A> List<T> switchByClass(Class<T> clazz) {
        return switch (clazz) {
            case Class<X> x-> xObjects();
            case Class<Y> y-> yObjects();
            default -> throw new IllegalArgumentException();
        };
    }

    public static List<X> xObjects() {
      return List.of(new X(), new X());
    }

    public static List<Y> yObjects() {
        return List.of(new Y(), new Y());
    }

对于这两种情况,我都会遇到编译器错误,例如,对于第一种情况:java.lang.Class<T>' cannot be safely cast to 'java.lang.Class<X>'

这是相当令人惊讶的,因为我预计 switch case 逻辑只是试图在后台进行转换以找到正确的匹配。

知道如何通过课堂工作获得匹配吗?(按对象类型匹配不是这里的重点)。这是java限制吗,比如不支持类匹配?

更新:

我尝试改用类名,但也不起作用。在 case xName, “需要常量表达式” yName。但是,我看不出 xName、yName 是如何不恒定的。据我了解,它们也应该是编译时间常数。

        public static <T> List<T> switchByClassString(Class<T> clazz) {
        final String xName = X.class.getName();
        final String yName = Y.class.getName();

        return switch (clazz.getClass().getName()) {
            case xName -> (List<T>) xObjects();
            case yName-> (List<T>) yObjects();
            default -> throw new IllegalArgumentException();
        };
    }
4

0 回答 0