java - 自动型类型转换

标签 java casting

我有一个程序需要接受类类型只在运行时才知道的对象。我想知道是否可以让程序自动将对象转换回正确的类类型?

以下代码是我目前拥有的;我将逐步解释我希望它做什么:

  1. 创建一个添加两个集合的 TryingSomething 实例(一个类类型 Foo,一个类类型 Bar)。
  2. 这些集合应该被添加到 HashMap 中。此时我已经从 Eclipse 收到警告,警告我这些集合不知何故不兼容。虽然类型是一样的。这里出了什么问题?
  3. 继续前进,假设上一步确实按预期工作。我希望再次在 main 方法中检索集合,但已经转换为正确的类类型(FooBar)。这行得通吗?如果没有,是否有替代方法允许我以正确的类类型检索对象?
  4. (奖励) 每个集合附带的名称 String 的引入是为了让我能够区分不同的类类型。如果能够在不需要字符串的情况下实现步骤 3 中的结果,那就更好了。

感谢任何能给我一些指点的人。

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{
}

最佳答案

您可以将类的类对象(运行时类型)用于映射键:

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 类不应该是通用的,因为您想要存储任意类型的集合(在运行时动态选择)。请注意,此实现根本不检查插入的集合是否实际上包含指定类型的对象(无论是在插入时还是在检索时)——这里的责任在于此容器类的用户。

关于java - 自动型类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41523649/

相关文章:

Java 最佳实践 : casting objects vs interfaces

java - 如何将字符串值转换为某种具体类型?

java - 将对象转换为通用类型以返回

Java - 可以将对象转换为它不扩展的类吗?

java - 返回值的静态方法可以抛出异常吗?

java - 长时间 GC 在应用程序中暂停

java - 我们可以在servlet中的方法之外声明一个字段吗

java - 如果我只需要查找一次位置,是否需要调用 requestLocationUpdates() ?

c++ - 具有多重继承的模糊基数

java - SQL JPA - 多列作为主键