Java 如何返回继承类的向量?

Java 如何返回继承类的向量?,java,generics,Java,Generics,我正在寻找一个解决方案来实例化并返回类的向量(或类似的东西) 我的尝试如下所示(Heritage扩展了超类): public Vector我已经有一段时间没有这样做了,但是当你需要添加内容时,“super”不是要使用的关键字吗?:) 是一个教程:)我已经有一段时间没有这样做了,但是当你需要添加内容时,“super”不是要使用的关键字吗?:) 是一个教程:)我认为问题在于,您告诉java使用从超类派生的类型的对象生成一个向量。然后添加一个类而不是对象。 一个肮脏的解决方案是创建一个类的向量,并在添

我正在寻找一个解决方案来实例化并返回类的向量(或类似的东西)

我的尝试如下所示(Heritage扩展了超类):


public Vector我已经有一段时间没有这样做了,但是当你需要添加内容时,“super”不是要使用的关键字吗?:)


是一个教程:)

我已经有一段时间没有这样做了,但是当你需要添加内容时,“super”不是要使用的关键字吗?:)


是一个教程:)

我认为问题在于,您告诉java使用从超类派生的类型的对象生成一个向量。然后添加一个类而不是对象。
一个肮脏的解决方案是创建一个类的向量,并在添加时进行测试,如果它是一个子类。

我认为问题在于您告诉java使用从超类派生的类型的对象创建一个向量。然后添加一个类而不是对象。
一个肮脏的解决方案是创建一个类的向量,并在添加时进行测试,如果它是一个子类。

您正在尝试添加一个
类的实例,即
Heritage.Class
。您的
向量
只允许
超类的子类


您需要添加一个
新的Heritage()
对象,但要构造其中一个对象。

您正在尝试添加
类的一个实例,即
Heritage.Class
。您的
向量
只允许
超类的子类


您需要添加一个
新Heritage()
对象,但要构造其中一个对象。

问题是,您试图将一个类添加到向量(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问题是,您试图向向量(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或者——正如其他人指出的那样——您必须添加一个Heritage实例:
new Heritage()

或者,为了存储类而不是实例,您必须正确声明向量:

Vector<Class<? extends SuperClass>>

或者,正如其他人所指出的,您必须添加一个Heritage实例:
newheritage()

或者,为了存储类而不是实例,您必须正确声明向量:

Vector<Class<? extends SuperClass>>

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

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

这里的问题是没有要添加的对象,只有类,正如它所说的“out.add(Heritage.class);”我正在寻找一种方法来创建类列表这里的问题是没有要添加的对象,只有类,正如它所说的“out.add(Heritage.class);”我在寻找一种创建类列表的方法是的,这就是我刚刚发现的:-)但方法签名似乎仍然是错误的:公共向量您可以使用ArrayList作为实现(或LinkedList…但ArrayList在大多数情况下都足够)。是的,这就是我刚刚发现的:-)但方法签名似乎仍然是错误的:公共向量您可以使用ArrayList作为实现(或LinkedList…但ArrayList在大多数情况下都足够了)。有点离题(因此发表评论),但使用ArrayList而不是Vector。Vector同步其方法,因此速度要慢得多。除了向后兼容之外,几乎没有理由在多线程代码中使用Vector。我想进一步说:几乎没有理由使用Vector。ever。或Hashtable、Enumeration和其他一些遗留类。有些f主题(因此是评论),但使用ArrayList而不是Vector。Vector会同步其方法,因此速度要慢得多。除了向后兼容之外,几乎没有理由在多线程代码中使用Vector。我想进一步说:几乎没有理由使用Vector.ever.或Hashtable、Enumeration和其他一些遗留类。
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]