2

たとえば、私は以下のようなジェネリック型を持っています

public class GenericType<T> {
   private T someVar;

   public void setVar(T var) { this.someVar = var; }

   //Rest of the code
}

特定のタイプ(String / Integer / Double)のみを使用できるようにします。有界ワイルドカードについては知っていますが、ここでは役に立ちません。setVar()で、instanceof型が整数/文字列などでない場合、をチェックして例外をスローできます。これが最善の方法ですか?

このタイプの操作を行うときにも同じ問題が発生します。タイプによって、違う操作をしたいです。継承と制限付きワイルドカードは、一般的にこの種の問題を解決する方法のように見えますが、これらはプリミティブラッパーです。

4

3 に答える 3

6

継承の使用:

Parent.java

public abstract class Parent<T> {
    public abstract void display(T t);
}

ChildString.java

public class ChildString extends Parent<String> {

    @Override
    public void display(String t) {
        // Do something here...
    }

}

ChildInteger.java

public class ChildInteger extends Parent<Integer> {

    @Override
    public void display(Integer t) {
        // Do something here...
    }

}

ChildDouble.java

public class ChildDouble extends Parent<Double> {

    @Override
    public void display(Double t) {
        // Do something here...
    }

}

また、親クラスに直接アクセスするのではなく、クラスの子にアクセスします。

アップデート

ここに別の例があります:

GenericType.java

public class GenericType {

    public void display(Object t) {
        String msg;
        if(t instanceof String) {
            msg = "String";
        } else if (t instanceof Integer) {
            msg = "Integer";
        } else if (t instanceof Double) {
            msg = "Double";
        } else {
            msg = "Another Object";
        }

        System.out.println(msg);
    }
}

SpecificGeneric.java

public class SpecificGeneric {

    public static void main(String[] args) {
        GenericType basicType = new GenericType();

        basicType.display(new String());
        basicType.display(new Integer(1));
        basicType.display(new Double(0.1));
    }
}
于 2012-05-04T07:44:29.953 に答える
0

できません(何かを拡張する以上のものですが、あなたの場合、無関係なタイプはほとんど必要ないので、役に立ちません)。

あなたができることは、メソッドに渡されたインスタンスをチェックすることです(あなたはすでにそれを知っています)。たとえば、ジェネリッククラスのインスタンスが1つ必要な場合。整数の場合は別の文字列を使用しますが、たとえば許可しないでください。Point2Dでは、パラメーターClass clazzを使用してコンストラクターを作成し、それが許可されているかどうかを構築するときにチェックできます。あなたがより妄想的であるならば、あなたはそのクラズを​​保存することができて、すべての関数でパラメータが実際にそのクラスであるかどうかを比較します。

このようにして、MyClassを作成することはできますが、このタイプのインスタンスを作成することはできません。(しかし、あなたはそれをキャストすることができます、それは絶対確実ではありません)

于 2012-05-04T07:50:51.910 に答える
0

希望するタイプを推測し、必要なときにGenericType<Double>使用instanceofするのが最も迅速で簡単なオプションです。または、オーバーロードsetVar(..)してGenericクラスの制限された型を受け入れます。

  public static class GenericType<T>
  {
    private T someVar;
    public void setVar(String var)
    {
      this.someVar = (T) var;
    }

    public void setVar(Integer var)
    {
      this.someVar = (T) var;
    }

    public void setVar(Double var)
    {
      this.someVar = (T) var;
    }
  }
于 2012-05-04T08:53:07.310 に答える