2011-11-30 6 views
22

ClassAまたはInterfaceBのいずれかを受け入れるメソッドを一般的にパラメータ化できますか?AND <T extends Numberの代わりに汎用ORを使用します。 CharSequence>

はコンパイルされません。擬似コード

public <T extends Number | CharSequence> void orDoer(T someData){ // ... } 

すなわち代わりに、複数のメソッドのシグネチャを書き込むので、私は数やたCharSequence引数

に渡す必要があります引数

として番号またはのCharSequenceのいずれかを受け入れるように、この一つの方法を希望します

orDoer(new Integer(6)); int somePrimitive = 4; orDoer(somePrimitive); orDoer("a string of chars"); 
+4

「Number」または「CharSequence」をそれぞれ受け入れ、次に3番目のプライベートメソッドに委譲して作業を行う2つの別々のメソッドではどうしますか? –

+1

私は2つのタイプを扱っている場合、利益は実体ではないと同意しますが、使用可能なスーパータイプを共有していないより多くのパラメータタイプを委譲するのは簡潔な方法です。 – Cel

+1

[Ceylon](http:// ceylon-lang.org/documentation/1.1/introduction/)の共用体型です。 ;) – Anonsage

答えて

16

本当にとしたい場合は、カスタムクラスのカスタムクラス内に受け入れられたクラスをラップする必要がありますウル自身。あなたの例の場合には、おそらくのようなもの:

public class OrDoerElement { 
    private final Number numberValue; 
    private final CharSequence charSequenceValue; 

    private OrDoerElement(Number number, CharSequence charSequence) { 
     this.numberValue = number; 
     this.charSequenceValue = charSequence; 
    } 

    public static OrDoerElement fromCharSequence(CharSequence value) { 
     return new OrDoerElement(null, value); 
    } 

    public static OrDoerElement fromNumber(Number value) { 
     return new OrDoerElement(value, null); 
    } 
} 

そして、あなたのorDoer方法は次のようになります。

public void orDoer(OrDoerElement someData) { .... } 

次にあなたがそれらのいずれかを構築し、いずれかを使用して、あなたの方法で使用することができます。

orDoer(OrDoerElement.fromCharSequence("a string of chars")); 
orDoer(OrDoerElement.fromNumber(new Integer(6))); 

しかし、正直言って、それはちょっと複雑すぎると思いますし、異なるパラメータタイプを持つメソッドを呼び出すことができるようにはあまりにも多くの作業をしています。あなたは2つの方法と共通ロジックの3つ目の方法を使って同じことを達成できないと確信していますか?

+0

答えをありがとう!私は今、私のユースケースを正しく説明しなかったことを理解しています - 私は 'T extends ClassA |なぜなら、私のメソッドの呼び出し側がそのままの型で渡すことができるからです(IntegerやStringなど)。つまり、.toString()から完全に再構成可能であるという特性を持つすべての種類の型と、標準の単一パラメータのインスタンス化(Number、CharSequence、Date、およびDate)を受け入れる 'store(T data)'メソッドを提供する。より多くの持続可能なタイプ)。 – Cel

+0

つまり、私が質問した別の方法は、Object、つまりNumber、CharSequence、その他のネイティブタイプの前に共有型がないことです。これらは、Uniconstructablesとして、またはそれらを呼び出すことを望むものとして特徴付けられます。理にかなっています) – Cel

+0

はい、私は理解しています、この種のスーパースーパークラスは実際には有用な場合があります。 – Guillaume

1

匿名抽象クラスを使用していますか?型の安全なパラメータや戻り値の型が必要な場合は、以下のコードをいくつか使用します。つまり、私はここでの他のコメントに同意しています。そして、それほど多くの共通点を持たないオブジェクトのグループに対してタイプセーフティを適用しているときに本当に派生したメリットについては興味があります。

public abstract class Doer<T> { 

    public void do(T obj) { 
    // do some stuff. 
    } 

} 

// calling method 

new Doer<Number>(){}.do(new Integer(5)); 
+1

ありがとう、Guillaumeのポストの説明を参照してください。 – Cel

関連する問題