gpt4 book ai didi

java - 在 Java 中将泛型类型与枚举相关联

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:55 24 4
gpt4 key购买 nike

我正在为用户偏好创建一个商店,用户可以为固定数量的偏好设置值。首选项(设置)的名称存储为枚举:

public enum UserSettingName {

FOO,
BAR,
ETC

}

我希望能够做的是存储一个带有名称的值类型,以便服务将使用正确的 Java 类型存储用户的值。例如,FOO 可能是 Long,而 BAR 可能是 String。到目前为止,我们将所有值存储为 String,然后手动将这些值转换为适当的 Java 类型。这导致到处都是 try/catch block ,而在服务中只有一个 try/catch 更有意义。我知道枚举不能有通用类型,所以我一直在玩:

public enum UserSettingName {

FOO(Long.class),
BAR(String.class),
ETC(Baz.class)

private Class type;

private UserSettingName(Class type) {
this.type = type;
}

public Class getType() {
return this.type;
}
}

我有一个通用的 UserSetting 对象,它具有 public T getSettingValue()public void setSettingValue(T value) 方法,它们应该返回并设置正确类型的值.我的问题来自于在创建或检索设置时尝试指定通用类型 T 因为我不能做类似的事情:

new UserSetting<UserSettingName.FOO.getType()>(UserSettingName.FOO, 123L)

抱歉,如果这不是很清楚,我可以尝试澄清一下是否不理解。

谢谢!

更新

设置名称和值都来自 Spring MVC REST 调用:

public ResponseEntity<String> save(@PathVariable Long userId, @PathVariable UserSettingName settingName, @RequestBody String settingValue)

所以我使用了枚举,因为 Spring 会自动转换传入的数据。

最佳答案

首先,您必须退后一步,思考您要实现的目标,然后使用标准模式或语言结构来实现它。

目前还不完全清楚您在这里追求什么,但从您的方法来看,几乎可以肯定您正在重新发明一些可以在 Java 中以更直接的方式完成的东西。例如,如果您确实需要了解和使用对象的运行时类,请考虑使用反射 API。

在更实际的层面上 - 您在这里尝试做的事情使用泛型是不可能的。泛型是一种编译时语言特性——它们有助于避免从 Object 显式转换所有内容,并在编译时为您提供类型检查。您根本不能以这种方式使用泛型,即将 T 设置为某个值 UserSettingName.Foo.getType() ,该值仅在运行时已知。

关于java - 在 Java 中将泛型类型与枚举相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19369874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com