2012-03-14 11 views
0

intやStringやdoubleのようなメソッドから異なる戻り値の型を取得する方法はありますか?メソッドから複数の戻り値タイプ

私は何のような

わからないジェネリック医薬品のワイルドカードを、使用していると考えることができます:

public x m1(){ 
//implementation 
} 

xはint型することができ、文字列、長いなど

+1

戻り値の型を 'Object'とします – Rakesh

+0

なぜこれが必要ですか? – Matthias

+0

これはおそらく役立ちますhttp://stackoverflow.com/questions/450807/java-generics-how-do-i-make-the-method-return-type-generic – hellectronic

答えて

2

いいえ、Javaは静的に型付けされているため。ジェネリック型や多相型を使用することはできますが、任意の型を返すことはできません(よく、返すことができますObject ...)戻り値をどのように扱うと思いますか?

??? value = m1() 

valueのタイプが不明であり、あなたはそれについて何もすることはできません。

しかし、Eitherに似た、一般的で強く型付けされたコンテナを考えることができます。 Apache Commons Lang 3にはPair<L,R>があります。これを例として取り上げることができます。

0

戻り値の型としてObjectクラスを使用し、IntegerまたはString(Wrapper)クラスを使用します。したがって、あなたが返すポイントは、そのクラスを識別するためにObjectのgetClass()メソッドを使用することができます。

1

いいえ、メソッドの戻り値の型は1つだけです。異なるタイプのオブジェクトを返す場合は、Objectを返すことができますが、その場合はまだキャストする必要があります。その場合、ボックス化されていないプリミティブも返すことはできません(つまり、intまたはdouble)。

ジェネリックスは、それらのキャストのいくつかを暗黙的に追加する点で多少役立ちます。 しかし、達成したいことに応じて、それは価値がないかもしれません。

私たちは、例えば、このようなものを使用している:

class BasicBuilder<T extends BasicBuilder<T>> { 
    private int value; 

    public T setValue(int v) { 
    value = v; 
    return (T)this; 
    } 
} 

class ConcreteBuilder extends BasicBuilder<ConcreteBuilder> { 
    //more here 
} 

この道を、私はConcreteBuilderインスタンスを持っており、それにsetValue(...)を呼び出したとき、私は戻ってConreteBuilderの参照を取得します。ジェネリックが正しく使用され、キャストが有効である場合にのみこれが機能することに注意してください。

1

HotSpot Java 6でジェネリックでこれを実行できましたが、これはバグとみなされ、Java 5.0もJava 7もこれをサポートしています。

http://vanillajava.blogspot.com/2011/02/with-generics-return-type-is-part-of.html

一般にJavaはコンテキスト認識していないが、Java 8とこれは、Java 7に暗黙タイプのサポートと変更されず、暗黙の型

共通の問題を回避するには、タイプを指定することです名。例えばByteBufferまたはDataInputでgetInt()getLong()getDouble()