首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java-12中的开关表达式返回泛型值

从Java-12中的开关表达式返回泛型值
EN

Stack Overflow用户
提问于 2019-03-10 22:28:35
回答 2查看 855关注 0票数 0

我想知道是否有从Java 12开关表达式返回泛型类型的选项。

基本代码可以如下所示:

代码语言:javascript
复制
boolean result = switch(ternaryBool) {
    case TRUE -> true;
    case FALSE -> false;
    default -> throw new IllegalArgumentException("Seriously?!");
};

有什么反对这样做的吗?

代码语言:javascript
复制
T result = switch(ternaryBool) {
    case TRUE -> BooleanUtils.toBoolean('true');
    case FALSE -> new Integer(0);
    default -> throw new IllegalArgumentException("Seriously?!");
};

编辑:

也许我的例子中更好的例子是:我需要几个表示原始和复杂数据结构的类。我还有工厂方法,它基于来自其他系统和未知值的枚举创建这个DataPointValue (,让我们忘记抛出异常):

代码语言:javascript
复制
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中的开关表达式有什么好处吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-11 02:11:31

有什么反对这样做的吗?

其中一列中的JEP 325:开关表达式(预览)描述了有关开关语句的扩展表示形式(格式化我的)如下:

开关表达式是一个多表达式;如果目标类型已知,则将该类型向下推到每个arm中。 开关表达式的类型是它的目标类型(如果已知的话);如果不是,则通过组合每个案例臂的类型来计算独立类型。。。

如果以上所述为真,编写开关表达式的类型可能是Object,除非您已经专门构建了一个自定义模型并封装了这些类型。

票数 1
EN

Stack Overflow用户

发布于 2019-03-31 14:37:14

移动这段代码并使用来自java12的开关表达式有什么好处吗?

这真的取决于你算什么利润。在查看相应的switch表达式时,会立即想到以下几点:

代码语言:javascript
复制
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);
        // ...
    };
}
  1. 您不需要default情况,因为编译器知道您正在处理所有枚举值(对枚举的运行时更改会导致问题)。
  2. 它的可读性更高一些,因为您对整个表达式进行了return,而不是在每个case中显式地使用,并且您不需要处理通过错误的语义。

至于问题的泛型方面,还不太清楚。首先,您的方法是在没有边界的情况下声明一个遗传参数,并且只使用它一次,所以它没有真正的意义。宣言

代码语言:javascript
复制
public static <T> IDataPointValue create(T value, DATA_TYPE dataType)

是相同的

代码语言:javascript
复制
public static IDataPointValue create(Object value, DATA_TYPE dataType)

因为T不添加任何信息。您可能想问一个关于您的数据结构的新问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55093043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档