如何返回继承类的Vector?

时间:2010-10-06 08:38:01

标签: java generics

我正在寻找一种解决方案来实例化并返回一个Vector(或类似的)类。

我的尝试看起来像这样(Heritage扩展SuperClass):

public Vector<? extends SuperClass> getAssignableClasses()
{
Vector<? extends SuperClass> out = new Vector<SuperClass>();
out.add(Heritage.class); //does NOT work, IDE shows error message

return out;
}

列表的声明似乎是错误的。 我想通过这个我只能添加对象列表,但是如何使用泛型添加类?

提前致谢!

6 个答案:

答案 0 :(得分:1)

我暂时没有这样做,但是当你需要添加东西时,不是'超级'要使用的关键字吗? :)

Here是一个教程:)

答案 1 :(得分:1)

您正在尝试添加Class的实例 - 即Heritage.class。您的Vector仅允许SuperClass的子类。

您需要添加一个new Heritage()对象,但是您可以构建其中一个。

答案 2 :(得分:1)

问题是,您正在尝试将类添加到Vector(Heritage.class)而不是具有相应类的对象。以下内容应该有效:

public Vector<? extends SuperClass> getAssignableClasses()
{
  Vector<? extends SuperClass> out = new Vector<SuperClass>();
  out.add(new Heritage()); //this line is changed
                           //add appropriate constructor parameters as necessary
  return out;
}

更新我重新阅读了您的问题。要返回具体类,您需要以下内容(我没有尝试过):

  public Vector<? extends SuperClass.class> getAssignableClasses()
  {
    Vector<? extends SuperClass> out = new Vector<SuperClass>();
    out.add(Heritage.class); //does NOT work, IDE shows error message
    return out;
  }

答案 3 :(得分:1)

或者 - 其他人指出 - 您必须添加遗产实例:new Heritage() ......

或者您必须正确声明Vector才能存储类而不是实例:

Vector<Class<? extends SuperClass>>

Class<? extends SuperClass>表示SuperClass.class或任何后代......

重要提示:使用List代替Vector。这是自Java 1.3以来推荐的列表界面:)

已添加:我已经检查了您评论中的代码,似乎编译好了:

import java.util.Vector;

public class SuperClass {
    public static void main() throws Exception {
        Vector<Class<? extends SuperClass>> vector = new Vector<Class<? extends SuperClass>>();
        vector.add(SuperClass.class);
        vector.add(Heritage.class);
    }

    public Vector<Class<? extends SuperClass>> getAssignableClasses() {
        Vector<Class<? extends SuperClass>> out = new Vector<Class<? extends SuperClass>>();
        out.add(Heritage.class);
        return out;
    }
}

class Heritage extends SuperClass {

}

答案 4 :(得分:1)

Vector是一个旧的,有点弃用的类。我将使用通用列表版本:

public static List<Class<?>> getAssignableClasses(final Object o){
    final List<Class<?>> list;
    if(o == null){
        list = Collections.emptyList();
    } else{
        list = new ArrayList<Class<?>>();
        Class<?> tmp = o.getClass();
        do{
            list.add(tmp);
            tmp = tmp.getSuperclass();
        } while(tmp != null);
    }
    return list;
}

作为奖励,这里有一种方法可以根据上述方法收集所有可分配的接口:

public static List<Class<?>> getAssignableInterfaces(final Object o){
    final List<Class<?>> result;
    final List<Class<?>> assignableClasses = getAssignableClasses(o);
    if(assignableClasses.isEmpty()){
        result = Collections.emptyList();
    } else{
        final Set<Class<?>> interfaces =
            new LinkedHashSet<Class<?>>(assignableClasses.size() * 2);
        for(final Class<?> clazz : assignableClasses){
            interfaces.addAll(Arrays.asList(clazz.getInterfaces()));
        }
        result = new ArrayList<Class<?>>(interfaces);
    }
    return result;
}

<强>测试

public static void main(final String[] args){
    final Map<String, String> map =
        new ConcurrentHashMap<String, String>();
    System.out.println(getAssignableClasses(map));
    System.out.println(getAssignableInterfaces(map));
}

<强>输出:

[class java.util.concurrent.ConcurrentHashMap, class java.util.AbstractMap, class java.lang.Object]
[interface java.util.concurrent.ConcurrentMap, interface java.io.Serializable, interface java.util.Map]

答案 5 :(得分:0)

我认为问题在于你告诉java使用从Superclass派生的类型的对象制作一个向量。然后你添加一个类而不是一个对象。 如果它是一个子类,那么一个肮脏的解决方案就是制作一个Class和test的向量。