我尝试通过使用 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();
};
}