SORU
27 Kasım 2010, CUMARTESİ


Neden't Java numaralama rakamları genel tür parametreleri olması gerekmez mi?

Java çeteleler harika. Çok jenerik. Elbette hepimiz yazın silinmesi nedeniyle ikinci sınırlarını biliyorum. Ama anlamadığım bir şey. Neden böyle bir sıralama oluşturabilirsiniz

public enum MyEnum<T> {
    LITERAL1<String>,
    LITERAL2<Integer>,
    LITERAL3<Object>;
}

Bu genel tür parametre <T>, daha sonra çeşitli yerlerde yararlı olabilir. Bir yöntem, genel tür parametresi düşünün:

public <T> T getValue(MyEnum<T> param);

Hatta numaralama sınıfta kendisi:

public T convert(Object o);

Daha somut bir örnek 1

Yukarıdaki örnek bir çok soyut bazı görünüyor, burada bunu yapmak istiyorum neden gerçek hayattan bir örnek daha. Bu örnekte kullanmak istiyorum

  • Sonra özellik anahtar sonlu bir set numaralandırma çünkü çeteleler
  • O zaman olabilir çünkü yöntem düzey depolama özellikleri için tür güvenliği jenerik
public interface MyProperties {
     public <T> void put(MyEnum<T> key, T value);
     public <T> T get(MyEnum<T> key);
}

Daha somut bir örnek 2

Veri türleri bir numaralandırma var:

public interface DataType<T> {}

public enum SQLDataType<T> implements DataType<T> {
    TINYINT<Byte>,
    SMALLINT<Short>,
    INT<Integer>,
    BIGINT<Long>,
    CLOB<String>,
    VARCHAR<String>,
    ...
}

Her isimli edebi açıkçası ek özellikler genel tür <T>, aynı zamanda, bir numaralama olmanın temelinde, singleton, sayısız, vb değişmez. vb.)

Soru:

Kimse bunu düşündün mü? Bu derleyici ile ilgili bir sınırlama var mı? Aslında, anahtar kelime olduğunu düşünüyor "numaralama

Bunu bana kim açıklayabilir? Cevap vermeden önce, bu göz önünde bulundurun:

  • Genel türler silinir biliyorum :-)
  • Geçici çözümler Sınıf nesneleri kullanarak olduğunu biliyorum. Geçici çözümler bunlar.
  • Genel türleri derleyici tarafından oluşturulan bir tür yerlere atmalarını geçerli neden convert ararken (örneğin() yöntemi
  • Genel tür <T> numaralama üzerinde olurdu. Dolayısıyla numaralama bu harflerin her biri ile ilişkilidir. Dolayısıyla derleyici String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject); gibi bir şey yazarken uygulamak için hangi biliyorum
  • Aynı T getvalue() yöntem genel tür parametresi için de geçerlidir. Derleyici String string = someClass.getValue(LITERAL1) çağrılırken türü döküm uygulayabilirsiniz

CEVAP
27 Kasım 2010, CUMARTESİ


Cevap soruda gizli

yazın silinme yüzünden

Bu iki yöntem hiçbiri bağımsız değişken türü silindiğinden beri mümkündür.

public <T> T getValue(MyEnum<T> param);
public T convert(Object);

Bu yöntemleri anlamak için ancak sizin numaralama olarak inşa:

public enum MyEnum {
    LITERAL1(String.class),
    LITERAL2(Integer.class),
    LITERAL3(Object.class);

    private Class<?> clazz;

    private MyEnum(Class<?> clazz) {
      this.clazz = clazz;
    }

    ...

}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • habpsu

    habpsu

    25 Temmuz 2007
  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • The Scary Snowman

    The Scary Sn

    1 ŞUBAT 2011