1

私はジェネリックスに少し不自由ですが、次のクラスについては疑問に思います。

static class SomeClass<T> {
 private T value;

 public SomeClass(T value) {
  T.class?
  this.value = value;
 }

 public T getValue() {
  return value;
 }
}

たとえば呼び出された場合: コンストラクターで(またはTが何であれ)SomeClass<String> stringer = new SomeClass<String>("Hello"); 取得することは可能ですか?String.class

ちょっと待って、私が解決しようとしていることを説明します

実際の問題は、OrmLiteを使用していて、次のようなDAOオブジェクトがたくさんあることです。

public class PostDAO extends BaseJdbcDao<Post, String> {
    public PostDAO(DatabaseType databaseType) {
        super(databaseType, Post.class);
    }
}

それDomainは:

public class DomainDAO extends BaseJdbcDao<Domain, String> {
 public DomainDAO(DatabaseType databaseType) {
  super(databaseType, Domain.class);
 }
}

等々。私はこれらをパラメータ化して、1つしか持てないようにしたかったのです。

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType) {
  super(databaseType, (WHAT HERE?));
 }
}

しかし、私はそのwhat here部分で立ち往生しています)

4

3 に答える 3

1

どうですか:

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType, Class databaseClass) {
  super(databaseType, databaseClass);
 }
}
于 2010-07-01T10:29:58.050 に答える
1

@pakoreの答えは良いものですが、クラスごとのDAOオブジェクトを定義する必要がないことを付け加えたいと思います。ORMLiteのドキュメントで推奨しましたが、これは便利であり、苦痛ではないはずです。

BaseJdbcDao匿名クラスとして使用すると、いつでも次のようなことができます。

BaseJdbcDao<Post, String> postDao =
    new BaseJdbcDao<Post, String>(databaseType, Post.class) {
    };
postDao.setDataSource(dataSource);
postDao.initialize();

私はORMLitejunitテストでそれをたくさん行います。次のようなユーティリティメソッドを使用する方がよい場合があります。BaseJdbcDao2.7リリースに含まれるクラスに追加しました。

public static <T, ID> Dao<T, ID> createDao(DatabaseType databaseType,
    DataSource dataSource, Class<T> clazz) throws SQLException {
    BaseJdbcDao<T, ID> dao = new BaseJdbcDao<T, ID>(databaseType, clazz) {
    };
    dao.setDataSource(dataSource);
    dao.initialize();
    return dao;
}
于 2010-07-08T15:49:41.437 に答える
-1

value.getClass()がトリックを実行する必要があります(値がnullになることはないと想定しています!)

于 2010-07-01T09:19:23.573 に答える