Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java-12中的开关表达式返回泛型值_Java_Generics_Switch Statement_Java 12_Switch Expression - Fatal编程技术网

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

从Java-12中的开关表达式返回泛型值,java,generics,switch-statement,java-12,switch-expression,Java,Generics,Switch Statement,Java 12,Switch Expression,我想知道是否有从Java12开关表达式返回泛型类型的选项 基本代码可以如下所示: boolean result = switch(ternaryBool) { case TRUE -> true; case FALSE -> false; default -> throw new IllegalArgumentException("Seriously?!"); }; 有什么反对这样做的吗 T result = switch(ternaryBool) {

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

基本代码可以如下所示:

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
让我们忘记强制转换异常):

公共静态IDataPointValue创建(T值,数据类型dataType)引发异常{
试一试{
交换机(数据类型){
案例布尔:
返回新的BoolDataPointValue((布尔)值);
案例INT:
返回新的IntDataPointValue((整型)值);
格词:
返回新的IntDataPointValue((整型)值);
大小写字符串:
返回新的StringDataPointValue((字符串)值);
真实案例:
案例浮动:
返回新的RealDataPointValue((Float)值);
案例力:
返回新的DIntDataPointValue((整型)值);
案例德沃德:
返回新的DWordDataPointValue((整型)值);
违约:
抛出新异常(“未实现数据类型:“+dataType”);
}
}catch(ClassCastException e){
抛出新异常(“无法根据类型不兼容创建DPV”);
}
}
从Java12迁移这段代码并使用switch表达式有什么好处吗

有什么反对这样做的吗

T result = switch(ternaryBool) {
    case TRUE -> BooleanUtils.toBoolean('true');
    case FALSE -> new Integer(0);
    default -> throw new IllegalArgumentException("Seriously?!");
};
在其中一列中,说明了有关switch语句的扩展表示形式(格式):

开关表达式是多边形表达式如果目标类型为 已知,这种类型被下推到每个手臂中

开关表达式的类型是其目标类型(如果已知)如果不是,则通过组合每个案例臂的类型来计算独立类型。

如果将上述内容保持为true,则编写时开关表达式的类型可能是
对象
,除非您专门构建了自定义模型并封装了这些类型

有什么反对这样做的吗

T result = switch(ternaryBool) {
    case TRUE -> BooleanUtils.toBoolean('true');
    case FALSE -> new Integer(0);
    default -> throw new IllegalArgumentException("Seriously?!");
};
在其中一列中,说明了有关switch语句的扩展表示形式(格式):

开关表达式是多边形表达式如果目标类型为 已知,这种类型被下推到每个手臂中

开关表达式的类型是其目标类型(如果已知)如果不是,则通过组合每个案例臂的类型来计算独立类型。

如果将上述内容保持为true,则编写时开关表达式的类型可能是
对象
,除非您专门构建了自定义模型并封装了这些类型

从java12迁移这段代码并使用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);
        // ...
    };
}

public static IDataPointValue create(Object value, DATA_TYPE dataType)
因为
T
不添加任何信息。您可能想问一个关于数据结构的新问题

从java12迁移这段代码并使用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);
        // ...
    };
}

public static IDataPointValue create(Object value, DATA_TYPE dataType)

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

这不是真正的泛型,是吗?泛型类型不是要求它们都返回相同的类型吗,只是它们返回的统一类型可以更改吗?你可以让它返回
对象
,然后再分类。是的,这只是为了简化。当然,我在想更复杂的事情。也许你应该发布一个更好地反映你所问情况的示例。不建议返回
Object
。您应该构建自己的层次结构,并封装这些类中的所有值。完成后,您可以用超类替换子类。这样,您也可以使用
动态绑定
(不需要
instanceof
运算符。@KhanSaab是的,
Object
是一个不好的建议,但它比使用泛型更有意义。这不是真正的泛型类型,是吗?泛型类型不要求它们都返回相同的类型,只是它们返回的统一类型可以更改吗?您可以让它返回
Object
,然后进行整理。是的,这只是为了简化。我当然在考虑更复杂的问题。也许你应该发布一个更好地代表你所问情况的示例。不建议返回
Object
。你应该构建自己的层次结构,并封装那些cla中的所有值类。完成后,您可以用超类替换子类。这样,您还可以使用
动态绑定
(不需要
instanceof
运算符。@KhanSaab是的,
对象
是一个不好的建议,但它比使用泛型更有意义。