【问题标题】:create an Array of a Class with reflection and generic at runtime在运行时创建具有反射和泛型的类的数组
【发布时间】:2015-01-04 09:26:43
【问题描述】:

我用泛型创建了这个类 ArrayBuilder 来做一些基本的操作来管理一个 T 对象的数组。

public class ArrayBuilder<T> {

@SuppressWarnings("unchecked")
public ArrayBuilder(Class<T> ct, int dim){
    container = (T []) Array.newInstance(ct, dim);
}

public T getElement(int index){
    return container[index];
}
public void setElement(int index, T value){
    container[index] = value; 
}
public T[] getContainer(){
    return container;
}

T[] container;

public static void main(String[] args) throws ClassNotFoundException {
    PrintStream ps = new PrintStream(System.out);
    Scanner sc = new Scanner(System.in);
    ps.print("che array desidera? ");
    String nameClass = "discover.";
    nameClass = nameClass + sc.nextLine();
    Class<?> toManipulate = Class.forName(nameClass);
    //Type type = toManipulate.getGenericSuperclass();
    ArrayBuilder<toManipulate> ab = new ArrayBuilder<toManipulate>(toManipulate, 10);

}

}

在主程序中,程序要求用户插入他喜欢的类的名称,所以我想使用 ArrayBuilder 构造函数来创建这种数组,但编译器不接受尖括号中的变量 toManipulate。也许我必须从 toManipulate 实例中提取泛型类型?

【问题讨论】:

    标签: java arrays generics reflection


    【解决方案1】:

    泛型是一种编译时特性。您所拥有的同样可以由原始类型处理,因为您在编译时不知道类型是什么。

    Class toManipulate = Class.forName(nameClass);
    ArrayBuilder ab = new ArrayBuilder(toManipulate, 10);
    

    或者如果你真的想使用泛型,你可以这样做

    Class<?> toManipulate = Class.forName(nameClass);
    ArrayBuilder<?> ab = new ArrayBuilder<Object>(toManipulate, 10);
    

    【讨论】:

    • 或者在这种情况下ArrayBuilder&lt;Object&gt; 似乎是一个更好的选择。 (没有关于原始类型的警告。)
    • @GáborBakos &lt;Object&gt; 表示它创建 Object 而不是子类。 ? extends Object 或只是 &lt;?&gt; 暗示它创建了一个对象 extends Object
    • 我相信第二个需要在toManipulate上进行演员表
    猜你喜欢
    • 2011-07-05
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多