0

实例化泛型类给出编译时错误:“无法直接实例化”

    public synchronized <T extends Persistable> T read(Class<T> clazz) {
    T temp;
    try {
        if(cache.containsKey(clazz)){
            return (T)cache.get(clazz);
        }else{
            Properties properties = getProperties();
            temp = internalFileManager.read(clazz,     properties.getProperty(clazz.getSimpleName()));
            if(temp == null){
                temp = new T();///cannot be instantiated directly
            }
            cache.put(clazz,temp);
            return temp;
        }
    } catch (Exception e) {
        Log.e("","",e);
        return null;
    }
    }

这是问题,所以 new T() 和 new Class() 都不起作用,它可能只是简单的解决方案,只需要一些提示。

4

2 回答 2

3

您不能实例化这样的通用参数(正如您所发现的那样)。

但是,您确实有一个Class可用的实例,因此您可以clazz.newInstance()在那里调用。

(这假设有问题的类有一个公共的、无参数的构造函数。如果不是这样,你需要使用反射来找到你需要的构造函数实例,然后用适当的参数调用它。

于 2013-09-12T14:35:15.677 回答
0

您不能实例化泛型。我看到你有Class目标T所以你可以做

if(temp == null){
   temp = clazz.newInstance();
}

边注:

如果T无界的,那么你可以用它来实例化它new Object()

于 2013-09-12T14:35:28.737 回答