我想知道是否有从Java 12开关表达式返回泛型类型的选项。
基本代码可能如下所示:
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表达式是否有任何好处?
有没有什么可以反对这样做?
其中一列中的JEP 325: Switch Expressions (Preview)声明了以下关于switch语句的扩展表示(格式化我的):
switch表达式是poly表达式;如果目标类型已知,则将此类型下推到每个臂中。
如果已知,则switch表达式的类型是其目标类型;如果不是,则通过组合每个案例臂的类型来计算独立类型。
保持上面的true,你写的切换表达式的类型可能是Object
,除非你专门形成了一个自定义模型并封装了类型。
移动此代码并使用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
不添加任何信息。您可能想问一个关于数据结构的新问题。