9
public class Test<T>{

    public boolean isMember(T item) {

        if(item instanceof Test)
        {
            return true;
        }
        return false;
    }
}

これは、アイテムがクラスのインスタンスであるかどうかを確認する正しい方法ですか?

いくつか検索しましたが、ジェネリッククラスの場合、これは機能しないようです。

4

3 に答える 3

5

ここで何をテストしようとしているのかは不明ですが、いくつかの可能性があります。

  1. ですか?item_ Tはい。そうしないと、おそらくメソッドに渡すことができませんでしたisMember。コンパイラはそれを許可しません。(以下のコメントのAlexの警告を参照してください。)
  2. ですか?item_ Test書かれているあなたのisMemberメソッドはこれをテストしますが、私はここでコードの臭いを感じています。Tなぜあなたはもであると期待するのTestですか?クラスをどのように編成しているかを再考することをお勧めします。また、これが本当に必要なものである場合、メソッドは次のように記述できます。

    public boolean isMember(T item) {
        return (item instanceof Test);
    }
    

    どちらが疑問を投げかけます:そもそもなぜこのような方法があるのですか?どちらが書きやすいですか?

    if(obj instanceof Test) {...}
    

    また

    if(Test<Something>.isMember(obj)) {...}
    

    最初の方法の方が単純であり、ほとんどのJava開発者は、カスタムメソッドよりも簡単にその意味を理解できると思います。

  3. ですか?item_ Test<T>Javaは消去を使用してジェネリックを実装しているため、実行時にこれを知る方法はありません。これが必要な場合は、MikeMyersの例のようにメソッドシグネチャを変更する必要があります。

于 2012-08-28T15:32:02.393 に答える
0

Tは変数ではありませんが、実行時に定義されるクラスのプレースホルダーです。ジェネリックはコンパイル時の機能であるため、コンパイル時にチェックを追加しますが、実行時には意味がない場合があります。実行時に参照されるオブジェクトのタイプのみをチェックできます。これは、コード内のスーパークラスタイプである可能性があります。タイプをパラメーターとしてメソッドに渡したい場合はT、次のように明示的にアプローチするだけです。

void genericMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

また

void genericMethod(Class<T> tClass, T tArg) {

タイプはここと同じではない可能性があることに注意してください。操作方法を確認できます。

genericMethod(Number.class, 1);
于 2012-08-28T15:28:31.157 に答える
-1
public class LinkList<T>{

    public boolean isMemberOfClass(T item) {

        if(item instanceof LinkList)
        {
            return true;
        }
        return false;
    }
}

申し訳ありませんが、回答として質問を投稿することはできません。

クラスLinkListはジェネリッククラスです。関数は、アイテムがクラスに属しているかどうかを確認することです。が同じTを持っているかどうかを確認します。

于 2012-08-29T15:33:33.487 に答える