【发布时间】:2019-08-01 05:55:27
【问题描述】:
我想知道是否有从 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 表达式有什么好处吗?
【问题讨论】:
-
那不是真正的泛型类型是吗?泛型类型不会要求它们都返回相同的类型,只是它们返回的统一类型可以改变吗?你可以让它返回
Object,然后整理出来。 -
是的,这只是为了简化。当然,我在考虑更复杂的事情。
-
也许您应该发布一个更能代表您所询问情况的示例。
-
不推荐返回
Object。您应该构建自己的层次结构并封装这些类中的所有值。完成后,您可以用超类替换子类。这样你也可以使用Dynamic binding(不需要instanceof操作符。 -
@KhanSaab 是的,
Object是一个糟糕的建议,但它比使用泛型更有意义。
标签: java generics switch-statement java-12 switch-expression