0

私は持っている

public class Entity

どの作品クラスで:

public class Table<Target extends Entity>
{
    public boolean save (Target target)
    public Target load (int id)
}

テーブルクラスのこのオブジェクトをデータベースクラスマップに配置するまで、すべて問題ありませんが、

public class Database
{
    public String name;
    public Map<String, Table<? extends Entity>> tables = new HashMap <String, Table<? extends Entity>> ();
    public Context context;
    public int version;
    public Database (Context context, int version)
    {
        this.context = context;
        this.version = version;
    }
    public void add (Table<? extends Entity> table)
    {
        tables.put(table.name, table);
    }
    public Table <? extends Entity> table (String name)
    {
        return (Table<? extends Entity>) tables.get(name);
    }

}

私たちが持っていると仮定します:

 public class Apple extends Entity

このコードを機能させたい:

    //init      
    database = new Database(getBaseContext(), 4);
    new Table<Apple> (database, Apple.class);

    //this is where solution need occurs !
    database.table("apples").save (new Apple("green apple"));

型 Table(capture#1-of ? extends Entity) のメソッド save(capture#1-of ? extends Entity) は引数に適用されません (注)

map.get メソッドを機能させるには?

4

2 に答える 2

1

これをより便利にするためにできることの1つは、ターゲットクラスごとにテーブルをマップすることです。

Map<Class<? extends Entity>, Table<? extends Entity>> tables;

public void <T extends Entity> addTable(Class<T> cls, Table<T> table) {
    tables.put(cls, table);
    // alternately make it possible to get the target class from the table
}

@SuppressWarnings("unchecked")
public <T extends Entity> Table<T> getTable(Class<T> cls) {
    return (Table<T>) tables.get(cls);
}

注釈が示すように、これはタイプセーフではありません。のキーと値が一致しないようにする必要がありますtables

于 2012-11-11T13:25:44.053 に答える
0

ユーザーmillimooseのおかげで、データベースクラスを変更しました。

public class Database
{
    public String name;
    public Map<Class<? extends Entity>, Table<? extends Entity>> tables = new HashMap <Class<? extends Entity>, Table<? extends Entity>> ();
    public Context context;
    public int version;
    public Database (Context context, String name, int version)
    {
        this.name = name;
        this.context = context;
        this.version = version;
    }

    public <Target extends Entity> void add (Class<Target> target, Table<Target> table) 
    {
        tables.put(target, table);
    }   

    @SuppressWarnings("unchecked")
    public <Target extends Entity> Table<Target> table (Class<Target> target) 
    {
        return (Table<Target>) tables.get (target);
    }   
}

その後、次のように使用することができました。

    database = new Database(getBaseContext(),"notes", 1);
    database.add (Note.class, new Table<Note> (database, Note.class));


    database.table(Note.class).save (new Note("first note"));
    database.table(Note.class).save (new Note("second note"));
    database.table(Note.class).save (new Note("best note"));

    items.addAll(database.table(Note.class).load());    

なぜそれが機能したのかを知るのに十分なスキルがまだないようですが、マップキーに(Class(?extends Entity))を追加すると問題が解決しました。

于 2012-11-11T17:46:01.713 に答える