2016-11-27 5 views
3

私は、文字列を読み込み、暗黙の(最良の適合)データ型の値を返すメソッドが欲しいと思います。私はコードが混乱を作成する可能性が高いので、 "メイン"でデータ型変換の文字列を行うことを避けたいと思います。これは可能ですか?異なる型を返すメソッドを作成できますか?コンストラクタはどのように見えますか?入力によって決定されるプリミティブデータ型を返すJavaメソッドを作成しますか?

+1

この値で何をする必要がありますか?型チェックを行うと、複雑な変換自体が隠されていても、混乱することに戻ります。 – Thilo

+1

唯一の可能な戻り値の型は 'Object'であるため、返されたデータの型を知るための呼び出し側の責任が与えられるので、これは非常に悪い考えです。この質問は、より多くの文脈がなければ、本当に答えることはできません。具体的には、これをどのように使いたいか、そして 'Object'を返すことの意味について考えている証拠があります。 –

答えて

1

はあなたがで終わるタイプを分類する方法として列挙型を探ることができます。あなたはそれを使用したいと言っているわけではないので、これは最良ではないかもしれませんが、あなたが与えた要件を処理する方法で行うことができます。

public class ClassifiedType 
{ 
    public enum ClassifiedTypeType { INTEGER, FLOAT, STRING, BOOLEAN }; 

    ClassifiedTypeType typeType = null; 
    int     integerValue; 
    float    floatValue; 
    String    stringValue; 
    boolean    booleanValue; 

    public ClassifiedType(int i) { integerValue = i; typeType = ClassifiedTypeType.INTEGER; } 
    public ClassifiedType(float f) { floatValue = f; typeType = ClassifiedTypeType.FLOAT; } 
    // etc. 

    public int getIntegerValue() 
    { 
    if (typeType != ClassifiedTypeType.INTEGER) 
    { 
     throw new IllegalArgumentException("Attempting getInteger on type of " + this.toString()); 
    } 
    else 
    { 
     return integerValue; 
    } 
    } 

    // do gets for other types similarly. 

    public static ClassifiedType getClassifiedType(String string) 
    { 
    // parse the string, determine which type you want, 
    // instantiate a ClassifiedType with its value and 
    // and type, and return it. 
    } 
} 

他のクラスは、彼らがそれを必要とする限り、そこから取得する値の種類を決定するために(うまくいけば、より良い名前を持つ)ClassifiedTypeTypeを使用することができます。

とにかく、Objectを返してから、instanceofを使って何を処理しているのか把握する必要があります。これが必要な場合は、非プリミティブにも拡張されます。

3

異なるプリミティブ型を返すことはできません。あなたにできることはObjectを返すようメソッドを宣言し、実行時のリターン箱入りのプリミティブである:などIntegerのインスタンス、DoubleBoolean

+0

これは間違いありませんが、私はオペアンプの質問全体に完全に答えているとは感じません – SeanRamzan

+0

OPがフォローアップの質問をしない限り、追加することはありません。 –

1

単一のJavaメソッド複数のタイプを返すことはできません。これは、Javaが強く型付けされた言語であるためです。

これを達成する方法はいくつかあります。あなたはOPで述べたように、コンストラクタのルートを移動したい場合、それは次のようになります。

public class Demo(){ 
    Demo(String str){ 
     // Do something... 
    } 

    Demo(int newInt){ 
     // Do something... 
    } 

    // Other constructors for other types here  
} 
+0

これは私のアプローチです。 'isString()'、 'isInt()'、 'getAsString()'、 'getAsInt()'などの便利なメソッドは、醜い型キャストを減らす/隠すことができます。 – Mshnik

+0

さて、これを行うためのよりクリーンな方法があると私は同意しますが、OPはコード内のデータ型の手動チェックを避けたいと考えられます。正しいヘルパーメソッドを使用するには、手動で変換する必要があります。 OPについては、上記のようにコンストラクタメソッドを使用すると、タイプ変換がバックグラウンドで行われていることを指摘したいと思います。あなたのケアが最適化されているかどうかは重要です。 – SeanRamzan

関連する問題