- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在“自动”转换属性时遇到一些问题。
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/
我是一名优秀的程序员,十分优秀!