SORU
13 NİSAN 2009, PAZARTESİ


Java Birden Fazla Sınıflar İle Joker Karakteri Jenerik

Bir Sınıf nesnesi olmak istiyorum, ama Bir sınıf genişletmek ve arayüz B. uygulamak için temsil gücü ne olursa olsun istiyorum

Yapabileceğim:

Class<? extends ClassA>

Ya da:

Class<? extends InterfaceB>

ama ikisini aynı anda yapamam. Bunu yapmanın bir yolu var mı?

CEVAP
13 NİSAN 2009, PAZARTESİ


Aslında sanaolabilirne yapmak istiyorsan yap. Eğer birden çok arabirimi veya sınıf artı bir arayüzleri sağlamak istiyorsanız, joker şöyle bir şey var:

<T extends ClassA & InterfaceB>

Sun.com, Bounded Type Parameters bölümüne özellikle Generics Tutorial, Bu sayfanın altındaki bakın. Aslında ihtiyacın olursa, her biri için & InterfaceName kullanarak isterseniz birden fazla arabirim listeleyebilirsiniz.

Bu keyfi karmaşık olabiliyor. Göstermek için, hangi Collections#max: JavaDoc bildirimi bakın

public static <T extends Object & Comparable<? super T>> T
                                           max(Collection<? extends T> coll)

neden bu kadar karmaşık? Java Jenerik SSS dediği gibi: To preserve binary compatibility.

Bu değişken tanımlaması için çalışmıyor gibi görünüyor, ama bir sınıf üzerinde genel bir sınır koymak zaman işe yarıyor. Bu nedenle, ne istediğinizi yapmak için, birkaç çemberin içinden atlamak zorunda kalabilirsiniz. Ama bunu yapabilirsiniz. Böyle bir şey, kendi sınıf ve sonra da genel bir sınır koyarak yapabilirsiniz:

class classB { }
interface interfaceC { }

public class MyClass<T extends classB & interfaceC> {
    Class<T> variable;
}

variable bunu almak zorunda istediğiniz kısıtlama. Daha fazla bilgi ve örnekler için Generics in Java 5.0 sayfa 3'e bak. Not <T extends B & C> sınıf adı her şeyden önce gelir, ve ARAYÜZLERİ izleyin. Ve tabii ki sadece tek bir sınıf listeleyebilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Britec09

    Britec09

    4 Mart 2009
  • failblog

    failblog

    17 HAZİRAN 2008
  • Lin Steven

    Lin Steven

    17 EKİM 2006