2016-09-21 13 views
0

Java 7以降、次のような同じcatch節で複数の例外をキャッチすることができます。複数の型のオブジェクトをメソッドにパラメータとして渡す

try { 
    ... 
} catch(IOException | SQLException ex) { 
    ... 
} 

同様に、継承を使用せずに次のように実装する方法はありますか?

public void passMultipleTypes(Type1 | Type2 obj) { 
    ... 
} 

objオブジェクトがType1又はType2のいずれかであり得ます。 これらのクラスが生成され、私はそれらを変更することができないので、私はここで継承を使用したくありません。だから私は

public class Test1 extends CommonSuperClass { 
    ... 
} 

Type1Type2は、同様の属性を持っているとして、それらを定義することはできません。だから私はobjと以下のように考えていました。

public void passMultipleTypes(Type1 | Type2 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 
+2

は、ここでは受け入れ答えを見てみましょう:のhttp:/を/stackoverflow.com/questions/10777384/method-accepting-two-different-types-as-parameter – Daneel

+1

@Daneel私はあなたが提案したソリューションをOPが選ぶことができるとは思わない。クラスが生成され、両方のクラスのインタフェースを実装するのは難しいかもしれません。 – Knu8

+0

ジェネリック型を確認してください。 – CrazyJavaLearner

答えて

1

クラスはいくつかのコードgenプラグインの一部として生成されるため、

この問題を解決するために、継承と一緒にコンポジションを使用できます。

共通インターフェイスに拡張されたType1およびType2用のラッパークラスを作成します。

これはコードの再利用性を提供するだけでなく、アプリケーションコードと第三者APIの間のレイヤーとして機能します。

public class Testing { 

    public static void main(String[] args) { 

     Processor processor = new Processor(); 
     processor.passMultipleTypes(new Type1Wraper()); 
     processor.passMultipleTypes(new Type2Wrapper()); 

    } 

} 

interface BasicType { 

    void operationOne(); 

    void operationTwo(); 

} 

class Type1 { 
} 

class Type2 { 
} 

class Type1Wraper implements BasicType { 

    private Type1 type; 

    @Override 
    public void operationOne() { 

     // type 1 method 

    } 

    @Override 
    public void operationTwo() { 

     // type 1 method 

    } 

} 

class Type2Wrapper implements BasicType { 

    private Type2 type; 

    @Override 
    public void operationOne() { 

     // type 2 method 

    } 

    @Override 
    public void operationTwo() { 

     // type 2 method 

    } 

} 

class Processor { 

    public void passMultipleTypes(BasicType object) { 

     object.operationOne(); 
     object.operationTwo(); 

    } 
+0

'passMultipleTypes(T obj)'の 'Type1'と' Type2'のメソッドにどうやってアクセスできるのか聞いてみましょう – Knu8

+0

タイプ1とタイプ2は共通のインターフェースを実装する必要があります。私の答えに追加されました。 –

+1

これはジェネリックスを導入することなく達成できます。'Type1'と' Type2'が共通のインターフェースを実装し、 'passMultipleTypes(BasicType type)'を – Knu8

0

継承を使用しないので、メソッドのオーバーロードを使用できます。

public void passMultipleTypes(Type1 obj) { 
    ... 
} 

public void passMultipleTypes(Type2 obj) { 
... 
} 

Type1の引数を渡すと、最初のメソッドが呼び出されます。引数がType2の場合、2番目の引数が呼び出されます。

+0

にすると、コードが重複してしまいます。 – Knu8

+0

はい、そうです。しかし、問題は、クラスは変更できないと言います。これが他の唯一の方法でした。 – user5478656

+0

まあええ。私はあなたのスタイルで現在の方法を持っています。私は重複を避けるためにこの質問をしました:-) –

0

あなたはクラスType1Type2を変更できない場合は、単にメソッドのオーバーロードを使用します。

public void passMultipleTypes(Type1 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 

public void passMultipleTypes(Type2 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 

「しかし、コードの重複....」はい、そうです。いくつかのコードの重複があります。しかし元のコードを変更することはできないので、うまくいけば元のコードを解決することはできません。重複を別の場所に移動するだけです。

+0

。この質問の唯一の目的は重複を避けることでした。 :-) –

+0

私は知っていますが、「コードを変更できません」という制限はありません。 –

0

あなたはScalaEitherクラスのようcutomタイプを定義することができます。

class Or<L,R> 
{ 
    private final Optional<L> left; 
    private final Optional<R> right; 

    ... 
} 

ですから、このように、このクラスを使用することができます:

public void passMultipleTypes(Or<Type1, Type2> obj) { 
    if(obj.isLeft()) { 

    } else { 

    } 
} 
関連する問題