java - 从 Java-12 中的 switch 表达式返回泛型值
问题描述
我想知道是否有从 Java 12 switch 表达式返回泛型类型的选项。
基本代码可能如下所示:
boolean result = switch(ternaryBool) {
case TRUE -> true;
case FALSE -> false;
default -> throw new IllegalArgumentException("Seriously?!");
};
有什么反对这样做的吗?
T result = switch(ternaryBool) {
case TRUE -> BooleanUtils.toBoolean('true');
case FALSE -> new Integer(0);
default -> throw new IllegalArgumentException("Seriously?!");
};
编辑:
也许是我的案例中更好的例子:我需要几个代表原始和复杂数据结构的类。我还有工厂方法,它DataPointValue
基于来自其他系统的枚举和未知值创建它(让我们忘记强制转换异常):
public static <T> IDataPointValue create(T value, DATA_TYPE dataType) throws Exception {
try {
switch (dataType) {
case BOOL:
return new BoolDataPointValue((Boolean) value);
case INT:
return new IntDataPointValue((Integer) value);
case WORD:
return new IntDataPointValue((Integer) value);
case STRING:
return new StringDataPointValue((String) value);
case REAL:
case FLOAT:
return new RealDataPointValue((Float) value);
case DINT:
return new DIntDataPointValue((Integer) value);
case DWORD:
return new DWordDataPointValue((Integer) value);
default:
throw new Exception("Data Type not implemented: " + dataType);
}
} catch (ClassCastException e){
throw new Exception("Could not create DPV in terms of Type incompability");
}
}
移动这段代码并使用 Java 12 中的 switch 表达式有什么好处吗?
解决方案
移动此代码并使用 java12 中的 switch 表达式有什么好处吗?
这实际上取决于您将什么视为利润。switch
在查看相应的表达式时,会立即想到几件事:
public static <T> IDataPointValue create(T value, DATA_TYPE dataType) {
return switch (dataType) {
case BOOL -> new BoolDataPointValue((Boolean) value);
case INT -> new IntDataPointValue((Integer) value);
case REAL, FLOAT -> new RealDataPointValue((Float) value);
// ...
};
}
- 您不需要
default
案例,因为编译器知道您正在处理所有枚举值(枚举的运行时更改会导致问题)。 - 它更具可读性,因为您
return
在整个表达式中而不是在每个表达式中case
,并且因为您不需要处理失败语义。
至于问题的泛型方面,还不是很清楚。一方面,你的方法是无限制地声明一个遗传参数,并且只使用一次,所以它没有真正的意义。宣言
public static <T> IDataPointValue create(T value, DATA_TYPE dataType)
是相同的
public static IDataPointValue create(Object value, DATA_TYPE dataType)
因为T
不添加任何信息。你可能想问一个关于你的数据结构的新问题。
推荐阅读
- javascript - 用于验证网站上的电子邮件的基本概念是什么?
- aws-lambda - 开玩笑,带有中间件的测试处理程序
- spring-boot - Spring WebFlux Kotlin OAuth2 CORS
- arrays - 按 Octave 中的列对矩阵进行排序
- rust - 引用上指定的生命周期是否表示引用或对象将存在多长时间?
- javascript - Vue 3 访问“this”属性($router、$store、...)
- django - 进程是否与 django-post_office 中的并发相同?
- python - 为什么我测试失败:读取行时出现 EOF
- python - Python3:如何根据条件拆分列表?
- flutter - 带有资产图像和文本的卡片