SORU
9 Ocak 2013, ÇARŞAMBA


Java SafeVarargs açıklama, standart veya en iyi yöntem var mı?

Son zamanlarda java rastladım@SafeVarargsaçıklama. Java güvensiz bir variadic bir işlev yapar ne için Googling beni oldukça (yığın zehirlenmesi mi? kafam karıştı sol sildim türleri?), bir kaç şey bilmek istiyorum:

  1. Variadic bir Java kılan güvensiz işlevi@SafeVarargssense (tercihen derinlemesine bir örnek şeklinde açıkladı)?

  2. Neden bu açıklama programcı bırakılmıştır? Bu derleyici için gereken bir şey değil mi?

  3. Onun işlevi gerçekten varags güvenli olduğundan emin olmak için uyması gereken bazı standart var mı? Bunu sağlamak için en iyi uygulamalar nelerdir?

CEVAP
10 Ocak 2013, PERŞEMBE


1) jenerik ve varargs ile belirli bir konu hakkında StackOverflow üzerinde internette birçok örnek Var. Temel olarak, tip-parametre bir tür bağımsız değişken bir dizi varsa:

void foo(T... args);

Java, varargs bir sözdizimsel şeker o uğrar basit bir "yeniden yazma" derleme zamanı: bir varargs parametre Tipi X... dönüştürülür parametre türü X[]; ve ne zaman bir çağrı yapıldıktan bu varargs yöntemi, derleyici toplar tüm "bağımsız değişken" alaka varargs parametre, bir dizi oluşturur gibi new X[] { ...(arguments go here)... }.

Bu varargs türü String... gibi somut olduğunda iyi çalışır. Bir tür T... gibi değişken olunca da T bu çağrı somut bir türü olduğu bilinmektedir. örneğin; eğer bu yöntem üzerinde bir sınıf Foo<T> ve sen Foo<String> başvuru, arama foo üzerinde olacağını pekala biliyoruz çünkü T String Bu kod.

Ancak, bu işe yaramazsa, "değer" T başka tür bir parametredir. Java, imkansız tür parametresi bileşen türden bir dizi (new T[] { ... }) oluşturmak için. Yani Java yerine kullanır new Object[] { ... } (Object üst sınır T; eğer orada üst sınır vardı, farklı bir şey olabilirdi bunun yerine Object), ve daha sonra bir derleyici uyarı verir.

new T[] yerine new Object[] oluşturma öyleyse neyin var ya da her neyse? Peki, Java'da diziler zamanında bileşen türü. Böylece, geçti dizi nesne çalışma zamanında yanlış bileşen tipi.

Muhtemelen varargs en yaygın kullanımı için, sadece öğeleri üzerinde yineleme için, bu güvenli olduğunu, bu yüzden herhangi bir sorun (dizi çalışma zamanı türü umurunda değil):

@SafeVarargs
void foo(T... args) {
    for (T x : args) {
        // do stuff with x
    }
}

Ancak, geçirilen bir dizi çalışma zamanı bileşen türüne bağlı olan bir şey için güvenli olmayacaktır. Burada güvensiz ve çöker bir şey basit bir örnek:

class UnSafeVarargs
{
  static <T> T[] asArray(T... args) {
    return args;
  }

  static <T> T[] arrayOfTwo(T a, T b) {
    return asArray(a, b);
  }

  public static void main(String[] args) {
    String[] bar = arrayOfTwo("hi", "mom");
  }
}

Sorun burada args tipi T[] olarak döndürmek için T[] aktarmamız lazım. Ama aslında çalışma zamanında değişken tipi T[] örneği değil.

3) Eğer yöntem tür bağımsız değişken Varsa T... T her tür parametre (burada), o zaman:

  • Eğer yöntem sadece dizinin öğeleri T örnekleri gerçeğine bağlıdır . güvenli:
  • Eğer dizi T[] bir örneği olduğu gerçeğini bağlıdır . güvensiz:

Şeyler bağlı çalışma zamanı tip dizi vardır: döndürüyor olarak yazın T[] geçirmeden argüman olarak bir parametre türü T[], dizinin türü kullanarak .getClass() geçirmeden yöntemleri bağımlı çalışma zamanı tür dizi gibi List.toArray() Arrays.copyOf() vb.

2) ayrım yukarıda bahsettiğim kolayca otomatik olarak ayırt edici olmak için çok karmaşık.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Breno Rises

    Breno Rises

    7 Ocak 2014
  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008