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が必要であるというエラーが表示されるのに、Objectが見つかったのはなぜですか?私が間違っているのは、ArrayList<T>ではなくArrayListの戻り型を持っていることです。

編集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();
}    

承認されたソリューションの付録

インターフェースに誤りがあったため、Typeを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ある class に型パラメーターを渡す必要があることです。そうしないと、 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パラメータ化されたものではなく、raw型を拡張しますReadOnlyTable<T>。に変更します

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