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