0

抱歉,不知道谁最好地提出问题,但我会在这里尝试解释我的问题,我有以下课程:

public class ReadOnlyTable<T extends Model> implements ReadOnly<T> {
...

protected ReadOnlyTable() {
    initTable();
}

protected void reloadDataSource() {
    initTable();
}

...

@Override
public ArrayList<T> findAll() {
    ArrayList<T> result = null;

    try {
        long startTime = System.currentTimeMillis();
        result = datasource.getAllEntries();
        //  // Logger.getLogger().write("FindAllQuery time was " + (System.currentTimeMillis() - startTime) + "ms");
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

    return result;
}

假设 T 是类“Galaxy”,然后我尝试使用以下代码遍历返回的数组中的所有元素

    for (Galaxy gal : gDAO.findAll()) {

    }

为什么它给我一个错误,说需要 Galaxy,但找到了对象?我做错了什么,我有返回类型 ArrayList 而不是 ArrayList<T>

编辑1:

gDAO 是这样定义的

private static GalaxyDAO gDAO = (GalaxyDAO) DAOFactory.get(GalaxyDAO.class);

而 DAOFactory 看起来像这样

    public static <T> T get(Class clazz) {
    if (!instanceList.containsKey(clazz)) {
        try {

            GenericDAO genericDAO = null;
            Constructor constructor;
            constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            genericDAO = (GenericDAO) constructor.newInstance();
            instanceList.put(clazz, genericDAO);

            return (T)genericDAO;
        } catch (NoSuchMethodException ex) {
            DebugBuffer.writeStackTrace(DAOFactory.class.getName(), ex);
        } catch (SecurityException ex) {
            DebugBuffer.writeStackTrace(DAOFactory.class.getName(), ex);
        } catch (InstantiationException ex) {
            DebugBuffer.writeStackTrace(DAOFactory.class.getName(), ex);
        } catch (IllegalAccessException ex) {
            DebugBuffer.writeStackTrace(DAOFactory.class.getName(), ex);
        } catch (InvocationTargetException ex) {
            DebugBuffer.writeStackTrace(DAOFactory.class.getName(), ex);
        }
    }else{
        return (T)instanceList.get(clazz);
    }

    return null;
}

最后

public class GalaxyDAO extends ReadWriteTable<Galaxy> implements GenericDAO {

是的.. ReadWriteTable 扩展了 ReadOnlyTable

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable implements ReadWrite<T> {
public ReadWriteTable() {              
    super();
}    

公认解决方案的附录

我的推断中有一个错误,导致无法将类型提供给 ReadOnlyTable 参见

public interface ReadWrite<T> extends ReadOnly {

代替

public interface ReadWrite<T> extends ReadOnly<T> {

修复后我也可以更改以下行

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable<T> implements ReadWrite<T> {
4

3 回答 3

1

gDAO是你的类的一个实例ReadOnlyTable<T extends Model>?它的类型参数是什么(你是如何声明的)?

它必须是Galaxy,否则将无法正常工作。

更新:既然你发布了更多代码,问题是你必须将类型参数传递给方法所在Galaxy的类,否则它不知道 T 是什么,并且会返回。ReadOnlyTable<T extends Model>findAllArrayList<Object>

这条线是问题所在:

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable implements ReadWrite<T> 

ReadOnlyTable 类也必须接收类型参数:

ReadOnlyTable<T extends Model>

所以这条线必须是:

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable<T extends Model> implements ReadWrite<T> 
于 2012-07-08T11:15:42.243 回答
0

问题在于ReadWriteTable声明,您已将其声明为

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable implements ReadWrite<T>

扩展原始类型ReadOnlyTable而不是参数化的ReadOnlyTable<T>. 将其更改为

public abstract class ReadWriteTable<T extends Model> extends ReadOnlyTable<T> implements ReadWrite<T>
于 2012-07-08T11:27:08.853 回答
0

问题是您将 GalaxyDAO 声明为行类型,​​它应该这样声明:

public class GalaxyDAO<Galaxy> extends ReadWriteTable<Galaxy> implements GenericDAO

我很担心你收到了编译器警告,不要忽视警告,你应该像错误一样威胁他们!

于 2012-07-08T11:35:56.080 回答