SORU
19 AĞUSTOS 2009, ÇARŞAMBA


Nasıl iki genel türleri ile bir arabirimi uygulayan bir Java sınıf için?

Genel bir arayüzü var

public interface Consumer<E> {
    public void consume(E e);
}

Nesnelerin iki tür tüketen bir Dersim var, şöyle bir şey yapmak istiyorum:

public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple>
{
   public void consume(Tomato t) {  .....  }
   public void consume(Apple a) { ...... }
}

Görünüşe göre bunu yapamam.

Tabii ki kendimi, örneğin gönderme uygulamak edebilirim

public class TwoTypesConsumer implements Consumer<Object> {
   public void consume(Object o) {
      if (o instanceof Tomato) { ..... }
      else if (o instanceof Apple) { ..... }
      else { throw new IllegalArgumentException(...) }
   }
}

Ama jenerik sağlayan derleme zamanı tür denetleme ve sevkiyat çözüm arıyorum.

Aklıma en iyi çözüm ayrı arayüzleri, örneğin tanımlamaktır

public interface AppleConsumer {
   public void consume(Apple a);
}

İşlevsel olarak, bu çözüm TAMAM, sanırım. Sadece laf kalabalığı ve çirkin.

Herhangi bir fikir?

CEVAP
19 AĞUSTOS 2009, ÇARŞAMBA


Saklama göz önünde bulundurun:

public class TwoTypesConsumer {
   private TomatoConsumer tomatoConsumer = new TomatoConsumer();
   private AppleConsumer appleConsumer = new AppleConsumer();

   public void consume(Tomato t) { 
       tomatoConsumer.consume(t);
      }

   public void consume(Apple a) { 
      appleConsumer.consume(a);
   }

  public static class TomatoConsumer implements Consumer<Tomato> {
      public void consume(Tomato t) {  .....  }
  }

  public static class AppleConsumer implements Consumer<Apple> {
      public void consume(Apple a) {  .....  }
  }

}

Eğer bu statik iç sınıflar oluşturma seni rahatsız ediyorsa, anonim sınıfları kullanabilirsiniz:

public class TwoTypesConsumer {

    private Consumer<Tomato> tomatoConsumer = new Consumer<Tomato>() {
        public void consume(Tomato t) {
        }
    };

    private Consumer<Apple> appleConsumer = new Consumer<Apple>() {
        public void consume(Apple a) {
        }
    };

    public void consume(Tomato t) {
        tomatoConsumer.consume(t);
    }

    public void consume(Apple a) {
        appleConsumer.consume(a);
    }

}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010