我正在寻找一种解决方案来实例化并返回一个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;
}
列表的声明似乎是错误的。 我想通过这个我只能添加对象列表,但是如何使用泛型添加类?
提前致谢!
答案 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的向量。