diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java index 42ee64c7e..1e9ad3f56 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java @@ -15,6 +15,7 @@ package org.dromara.hutool.core.convert; import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.RecordUtil; import org.dromara.hutool.core.convert.impl.*; +import org.dromara.hutool.core.lang.Opt; import org.dromara.hutool.core.reflect.TypeReference; import org.dromara.hutool.core.reflect.TypeUtil; import org.dromara.hutool.core.reflect.kotlin.KClassUtil; @@ -24,6 +25,7 @@ import java.lang.reflect.Type; import java.util.Collection; import java.util.Date; import java.util.Map; +import java.util.Optional; /** * 复合转换器,融合了所有支持类型和自定义类型的转换规则 @@ -106,20 +108,34 @@ public class CompositeConverter extends RegisterConverter { * @throws ConvertException 转换器不存在 */ @SuppressWarnings("unchecked") - public T convert(Type type, final Object value, final T defaultValue, final boolean isCustomFirst) throws ConvertException { + public T convert(Type type, Object value, final T defaultValue, final boolean isCustomFirst) throws ConvertException { if (ObjUtil.isNull(value)) { return defaultValue; } if (TypeUtil.isUnknown(type)) { // 对于用户不指定目标类型的情况,返回原值 - if(null == defaultValue){ + if (null == defaultValue) { return (T) value; } type = defaultValue.getClass(); } + // issue#I7WJHH,Opt和Optional处理 + if (value instanceof Opt) { + value = ((Opt) value).get(); + if (ObjUtil.isNull(value)) { + return defaultValue; + } + } + if (value instanceof Optional) { + value = ((Optional) value).orElse(null); + if (ObjUtil.isNull(value)) { + return defaultValue; + } + } + // value本身实现了Converter接口,直接调用 - if(value instanceof Converter){ + if (value instanceof Converter) { return ((Converter) value).convert(type, value, defaultValue); } @@ -183,7 +199,7 @@ public class CompositeConverter extends RegisterConverter { } // 日期、java.sql中的日期以及自定义日期统一处理 - if(Date.class.isAssignableFrom(rowType)){ + if (Date.class.isAssignableFrom(rowType)) { return DateConverter.INSTANCE.convert(type, value, defaultValue); } @@ -198,7 +214,7 @@ public class CompositeConverter extends RegisterConverter { } // issue#I6SZYB Entry类(含有泛型参数,不可以默认强转) - if(Map.Entry.class.isAssignableFrom(rowType)){ + if (Map.Entry.class.isAssignableFrom(rowType)) { return (T) EntryConverter.INSTANCE.convert(type, value); } @@ -208,12 +224,12 @@ public class CompositeConverter extends RegisterConverter { } // 原始类型转换 - if(rowType.isPrimitive()){ + if (rowType.isPrimitive()) { return PrimitiveConverter.INSTANCE.convert(type, value, defaultValue); } // 数字类型转换 - if(Number.class.isAssignableFrom(rowType)){ + if (Number.class.isAssignableFrom(rowType)) { return NumberConverter.INSTANCE.convert(type, value, defaultValue); } @@ -228,17 +244,17 @@ public class CompositeConverter extends RegisterConverter { } // Record - if(RecordUtil.isRecord(rowType)){ + if (RecordUtil.isRecord(rowType)) { return (T) RecordConverter.INSTANCE.convert(type, value); } // Kotlin Bean - if(KClassUtil.isKotlinClass(rowType)){ + if (KClassUtil.isKotlinClass(rowType)) { return (T) KBeanConverter.INSTANCE.convert(type, value); } // issue#I7FQ29 Class - if("java.lang.Class".equals(rowType.getName())){ + if ("java.lang.Class".equals(rowType.getName())) { return (T) ClassConverter.INSTANCE.convert(type, value); } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/convert/IssueI7WJHHTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/convert/IssueI7WJHHTest.java new file mode 100755 index 000000000..d712d21cc --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/convert/IssueI7WJHHTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.convert; + +import org.dromara.hutool.core.lang.Opt; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +public class IssueI7WJHHTest { + @Test + public void toIntTest() { + final Optional optional = Optional.of(1); + final Integer integer = Convert.toInt(optional); + + Assertions.assertEquals(Integer.valueOf(1), integer); + } + + @Test + public void toIntTest2() { + final Opt optional = Opt.of(1); + final Integer integer = Convert.toInt(optional); + + Assertions.assertEquals(Integer.valueOf(1), integer); + } +}