2012-05-04 1 views
2

セイで許可されるタイプの数を制限しない、私はそれが唯一の特定のタイプ(文字列/整数/ダブル)を取ることができるようにしたいはどのように1は、Javaのジェネリック型

public class GenericType<T> { 
    private T someVar; 

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

    //Rest of the code 
} 

以下のように、私は、ジェネリック型を持っています。私は有界ワイルドカードについて知っていますが、ここで私を助けません。 setVar()では、instanceofをチェックして、型が整数/文字列などでない場合に例外をスローすることができます。これを行うのが最良の方法ですか?

このタイプの操作を実行する場合、同じ問題が発生します。タイプによっては、私は別の操作をしたい。継承と制限付きのワイルドカードは、この種の問題で一般的に使用される方法のようですが、これらは基本ラッパーです。

+0

申し訳ありませんが、私は文字列型を見ていない – DaTroop

+0

うん、あなたがそこに醜いソリューションで立ち往生している男...タイプが継承することにより、無関係であるため、問題にはストレートかなりソリューション... – Thihara

答えて

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)); 
    } 
} 
+0

有効な答えはありませんが、所望の効果を達成するために行くのはあまりにも多くのトラブルのように見えませんか?私はあなたがすべてのタイプの子供クラスを必要とすることを意味します.. – Thihara

+0

はい、私はあなたに同意します。私はちょうど質問者が必要とするものに基づいて例を挙げています。継承を使わないで別の例を挙げましょう:-) – Crazenezz

+1

@灰原:私の答えを更新しました... – Crazenezz

0

あなたは(何かを拡張する以上のことはできませんが、あなたのケースでは無関係なタイプはほとんどないので、助けにはなりません)。

可能なことは、メソッドに渡されたcheckインスタンスです(あなたはすでに知っています)。たとえば、ジェネリッククラスのインスタンスを1つ必要な場合。整数のために別の文字列を入れますが、例えば許可しません。 Point2Dでは、パラメータClass clazzを使用してコンストラクタを作成し、それが許可されているかどうかを確認することができます。 あなたがもっと妄想的であるならば、そのクラスを格納することができ、すべての関数において、そのパラメータが実際にそのクラスであるかどうかを比較することができます。

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

0

GenericType<Double>と言っていいでしょう。必要ならば、最も簡単で簡単なオプションはinstanceofです。代わりに、汎用クラスの制限された型を受け入れるために、オーバーロードsetVar(..)を使用します。

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; 
    } 
    } 
関連する問題