当前位置:  开发笔记 > 编程语言 > 正文

转换为在运行时确定的类

如何解决《转换为在运行时确定的类》经验,为你挑选了1个好方法。

我有一个方法fetchObjects(String),期望返回一个Contract业务对象数组.该className参数告诉我应该返回什么样的业务对象(当然这在这个解释的情况下没有意义,因为我已经说过我将返回Contracts,但它基本上是我在真实场景中的情况).所以我从某处获取了一组条目并加载了集合条目的类(其类型由其指定className).

现在我需要构造要返回的数组,所以我使用SettoArray(T[])方法.使用反射,我构建了一个空的Contracts数组.但是,这给了我一个静态类型的值Object!接下来我需要将它转换为适当的类型,在本例中是Contract[](参见下面列表中的"带星号 - 下划线"部分).

我的问题是:有没有一种方法,以及如何Contract[]在列表中进行转换,Contract仅通过className(或entriesType)确定数组元素的类型()?换句话说,我想要做的就是基本上像这样::(entriesType[]) valueWithStaticTypeObject,其中entriesType被通过classname参数指定的类替换,即Contract.

这在某种程度上是不可能的,或者它可以以某种方式完成吗?也许使用泛型?

package xx.testcode;

import java.util.HashSet;
import java.util.Set;

class TypedArrayReflection {

    public static void main(String[] args) {
        try {
            Contract[] contracts = fetchObjects("Contract");
            System.out.println(contracts.length);
        } catch (ClassNotFoundException e) {}
    }

    static Contract[] fetchObjects(String className) throws ClassNotFoundException {
        Class entriesType = Class.forName("xx.testcode."+className);
        Set entries = ObjectManager.getEntrySet(className); 
        return entries.toArray( 
                (Contract[]) java.lang.reflect.Array.newInstance(
                /********/          entriesType, entries.size()) );
    }
}

class Contract { } // business object

class ObjectManager {
    static Set getEntrySet(String className) {
        if (className.equals("Contract"))
            return new HashSet();
        return null; // Error
    }
}

谢谢.


更新:使用toArray从CodeIdol获取的类型安全方法,我更新了我的fetchObjects方法:

static Contract[] fetchObjects(String className) throws ClassNotFoundException {
    Class entriesType = Class.forName("xx.testcode."+className);
    Set entries = ObjectManager.getEntrySet(className);
    return toArray(entries, entriesType); // compile error
    // -> "method not applicable for (Set, Class)"
}

public static  T[] toArray(Collection c, Class k) {
    T[] a = (T[]) java.lang.reflect.Array.newInstance(k, c.size());
    int i = 0;
    for (T x : c)
        a[i++] = x;
    return a;
}

我需要做些什么才能摆脱评论中引用的编译器错误?我是否必须Set在我的getEntrySet方法的返回类型中指定,以便这可以工作?谢谢你的任何指示.



1> Dennis C..:

您可以使用该类作为参数,而不是类名.

   static  T[] buildArray(Class clazz){
     ArrayList l=new ArrayList();
     return l.toArray((T[]) java.lang.reflect.Array.newInstance(clazz, l.size()));
   }

编辑:(读杨评论后)

不,您不能将泛型类型与变量的值一起使用.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有