我有一个程序需要接受只在运行时才知道类类型的对象。我想知道是否有可能让程序自动将对象强制转换为正确的类类型?
以下代码是我目前拥有的代码;我将逐步解释我希望它做什么:
TryingSomething
实例,添加两个集合(类类型Foo
之一,类类型Bar
之一)。Foo
和Bar
)。这会有用吗?如果没有,是否有替代方案允许我以正确的类类型检索对象? 感谢任何能给我一些指示的人。
class TryingSomething<T> {
private Map<String, Set<T>> map = new HashMap<String, Set<T>>();
public void addCollection(Set<T> s, String name){
this.map.put(name, s);
}
public void test(){
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
addCollection(foo, "foo");
addCollection(bar, "bar");
}
public Set<T> getCollections(String name){
return this.map.get(name);
}
@SuppressWarnings("unchecked")
public static void main(String[] args){
TryingSomething t = new TryingSomething();
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
t.addCollection(foo, "foo");
t.addCollection(bar, "bar");
Set<Foo> fooList = t.getCollections("foo");
Set<Bar> barList = t.getCollections("bar");
}
}
class Foo{
}
class Bar{
}
答案 0 :(得分:1)
您可以使用类的类对象(运行时类型)作为映射键:
class TryingSomething {
private Map<Class<?>, Set<?>> map = new HashMap<>();
public <T> void addCollection(Set<T> s, Class<T> clazz){
map.put(clazz, s);
}
public void test(){
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
addCollection(foo, Foo.class);
addCollection(bar, Bar.class);
}
@SuppressWarnings("unchecked")
public <T> Set<T> getCollections(Class<T> clazz){
return (Set<T>)this.map.get(clazz);
}
public static void main(String[] args){
TryingSomething t = new TryingSomething();
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
t.addCollection(foo, Foo.class);
t.addCollection(bar, Bar.class);
Set<Foo> fooList = t.getCollections(Foo.class);
Set<Bar> barList = t.getCollections(Bar.class);
}
}
class Foo{
}
class Bar{
}
类TryingSomething
不应该是通用的,因为您要存储任意类型的集合(在运行时动态选择)。请注意,此实现不会检查插入的集合是否实际上包含指定类型的对象(无论是在插入还是在检索时) - 此处的可重用性取决于此容器类的用户。