gpt4 book ai didi

java - 如何在java中隐式或自动转换

转载 作者:行者123 更新时间:2023-12-01 06:35:36 27 4
gpt4 key购买 nike

我在“自动”转换属性时遇到一些问题。

public abstract class MyType<T> {
public abstract T getValue(String content);
}

public class MyString extends MyType<String> {
@Override
public String getValue(String content) {
return String.valueOf(content);
}
}

public class MyInteger extends MyType<Integer> {
@Override
public Integer getValue(String content) {
return Integer.valueOf(content);
}
}

public class User {
private String _name;
private int _id;

public void setName(String name) {
_name = name;
}

public String getName() {
return _name;
}

public void setId(int id) {
_id = id;
}

public int getId() {
return _id;
}
}

public class MainTest {
public static void main(String[] args) {
ArrayList<MyType> myTypes = new ArrayList<MyType>();
myTypes.add(new MyString());
myTypes.add(new MyInteger());

User user = new User();

for (MyType myType : myTypes) {
try {
user.setName((String) myType.getValue("foobar")); // getValue always returns an Object that I have to parse
user.setId((Integer) myType.getValue("42")); // getValue always returns an Object that I have to parse
} catch (Exception e) {
}
}
}
}

请记住,这只是我的问题的一个抽象示例。

如何更换铸件?我需要这样的东西:

user.setName((user.getName().getClass()) myType.getValue("foobar"));

不幸的是 eclipse 告诉我这是错误的 The method getValue(String) is undefined for the type Class<capture#3-of ? extends String>

我不会明确地转换。我会更加隐式/自动地施放。

最佳答案

问题是myTypes列表被声明为 List<MyType> ,它使用 raw type MyType而不是 MyType 的特定参数化在列表中。 This is generally discouraged, warned against, bad practice, etc.

通常您会像 List<MyType<String>> 那样声明列表。或List<MyType<Integer>> 。这将使您无需强制转换即可取出元素。但是,这是有问题的,因为您希望能够混合 MyType<String>MyType<Integer>相同列表中。同样,通常不建议这样做,并且是 code smell .

所以你可以声明 List<MyType<?>>相反,这比 List<MyType> 更好,但幅度不大。唯一正确的结论是设计本身就有缺陷:不要尝试在集合中混合异构类型。*

<小时/>

The class MyType was just an abstract example. Actually my question was how I can cast: user.setName((user.getName().getClass()) object); if object is Object object = "foobar";

无论如何,问题本质上仍然是您在列表中使用原始类型。看来您最好使用维护类型参数化的东西,例如 Map<Class<T>, MyType<T>>而不是List<MyType> .

考虑申请the strategy pattern在这里。

<小时/>

*专家模式:除非有一个合理的通用父类(super class)型,您可以将其用作上限。

关于java - 如何在java中隐式或自动转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042243/

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