5

次の例を見てみましょう。

public class BothPaintAndPrintable implements Paintable,Printable{
    public void print() {}
    public void paint() {}
}
public interface Paintable {
    public void paint();
}

public interface Printable {
    public void print();
}

public class ITest {
    ArrayList<Printable> printables = new ArrayList<Printable>();
    ArrayList<Paintable> paintables = new ArrayList<Paintable>();
    public void add(Paintable p) {
        paintables.add(p);
    }
    public void add(Printable p) {
        printables.add(p);
    }
    public static void main(String[] args) {
        BothPaintAndPrintable a= new BothPaintAndPrintable();
        ITest t=new ITest();
        t.add(a);//compiliation error here
    }
}

BothPaintAndPrintable各 ArrayList にインスタンスを追加したい場合はどうすればよいですか? 1 つの方法は、BothPaintAndPrintableパラメーターを使用してメソッドをオーバーロードすることですが、これを行うとコードの再利用性が低下する可能性があるため、別の方法を検討しています。誰か別のアイデアがありますか?

4

4 に答える 4

7

3番目のオーバーロードが必要です。

public <T extends Object&Paintable&Printable> void add(T t) {
  paintables.add(t);
  printables.add(t);
}

これにより消去add(Object)が行われるため、他のメソッドと競合することはありませんが、入力をとの両方の実装者に制限しPaintableますPrintable

(Guavaはwithとにこのトリックを使用する必要がありました。それはひどい考えですが、そこにあるいくつかの邪悪なクラスが両方を実装したためです。)JoinerIteratorIterable

于 2012-08-01T15:36:12.517 に答える
2

私は一般的なadd(Object o)方法で行き、次に をチェックしinstanceof、 を対応するリストに入れObjectます。

渡された がObjectどちらのインターフェースも実装していない場合は、 をスローするInvalidArgumentExceptionことをお勧めします。

于 2012-08-01T15:30:00.907 に答える
0

私が実際に好きな方法を見つけることができないので、ベストアンサーについてはわかりません!

ジェネリックスを使用することもできますが、「instanceof」テストも必要なキャストも好きではありません。

import java.util.ArrayList;

class BothPaintAndPrintable implements Paintable, Printable {
    public void print() {
    }

    public void paint() {
    }
}

interface Paintable {
    public void paint();
}

interface Printable {
    public void print();
}

 public class ITest<T> {
    ArrayList<Printable> printables = new ArrayList<Printable>();

    ArrayList<Paintable> paintables = new ArrayList<Paintable>();

    public void add(T p) {
        if (p instanceof Paintable) {
            paintables.add((Paintable) p);
        }
        if (p instanceof Printable) {
            printables.add((Printable) p);
        }
    } 

    public static void main(String[] args) {
        BothPaintAndPrintable a = new BothPaintAndPrintable();
        ITest<BothPaintAndPrintable> t = new ITest<BothPaintAndPrintable>();
        t.add(a);
    }
}
于 2012-08-01T15:38:06.863 に答える
0

わかりました、私は正しい答えが好きです。ただし、OPに指摘する必要がある別の解決策があります。

public static void main(String[] args) {
    BothPaintAndPrintable a= new BothPaintAndPrintable();
    ITest t=new ITest();
    t.add((Paintable)a);
    t.add((Printable)a);
}

これは 3 番目のメンバーを追加しなくても機能し、さらにインターフェースを追加することにした場合でも機能します。

于 2012-08-01T17:16:37.857 に答える