25

ジェネリック全体がちょっとループに陥っています。RTT はさらにそうです。

具体的に?ああ、要点は次のとおりです。

enum QueryHelper {
  query1,
  query2;
  static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
  }
}

そして、私はそれを次のように呼びます:

...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...

これは、実際のヘルパーでクエリの戻り値の型を非常に柔軟に割り当てることができるようにするためです。いくつかのキャストとオブジェクトの作成を行います。私が見ているのは、一致するものがないということです。これを別の方法で行う必要がありますか? それとも、アイデア全体が悪いのでしょうか?

そして、これの本当の核心は、class.isInstance と instanceOf 演算子の違いを理解していないことです。後者を使用する必要がありますか?

4

3 に答える 3

30

これは、実際のヘルパーでクエリの戻り値の型を非常に柔軟に割り当てることができるようにするためです。

このメソッドの戻り値の型には柔軟性がありません

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
}

のインスタンスを常に返しますQueryHelper。戻り値の型を柔軟にしたい場合は、次のように定義する必要があります。

static <T> T getQueryHelper (Class<T> expectedReturn) {
}

引数の型に依存するため、戻り値の型は柔軟になりました。

そして、これの本当の核心は、class.isInstance と instanceOf 演算子の違いを理解していないことです。

違いは、instanceof がコンパイル時に修正される型チェックを行うことです。次に例を示します。

static boolean isInstance(Object myVar) {
    return (myVar instanceof Foo);
}

myVar が Foo のインスタンスであることを常にチェックしますが、

static <T> boolean isInstance(Object myVar, Class<T> expectedType) {
    return expectedType.isInstance(myVar);
}

myVar が expectedType のインスタンスであることを確認しますが、expectedType はメソッドが呼び出されるたびに異なる型になる可能性があります

于 2010-11-10T00:31:04.117 に答える
3

Class.isInstance() は、コードが期待するようには機能しません。渡されたオブジェクトがクラスのインスタンスであるかどうかをテストします。あなたのコードで:

expectedReturn.isInstance(SomeRelatedClass.class)

渡すオブジェクトは Class オブジェクトです。代わりにこれを試してみてください。これは true を返します:

Class.class.isInstance(SomeRelatedClass.class);

おそらく探しているのはClass.isAssignableFrom()です。

Object.class.isAssignableFrom(Class.class);

これを行うことができることを意味します:

Class klass = ...;
Object o = klass;
于 2010-11-10T00:26:49.150 に答える
1

isInstance の予想される引数は、クラス オブジェクトが表すクラスのインスタンスである可能性があるオブジェクトです。あなたが比較しているのは、クラスのインスタンスです... java.lang.Class! なので、合いません。

たとえば、次のようになります。

Class.class.isInstance(SomeRelatedClass.class);

また、このようにクエリヘルパーを実際に構築することの健全性に関するアーキテクチャの解説はありません)

expectedReturn.isInstance(new SomeRelatedClass());
于 2010-11-10T00:26:47.507 に答える