SORU
10 Temmuz 2011, Pazar


Neden't sınırlı bir joker, genel olarak birden çok arabirimi olabilir?

Java genel bir tür karşı-sezgisel özellikleri her türlü var. İşte bunu anlamıyorum, biri bana açıklayabilir umuyorum ki özellikle bir tanesi. Bir sınıf veya arabirim için bir tür parametresi belirtirken, public class Foo<T extends InterfaceA & InterfaceB> ile birden çok arabirim uygulamak gerekir, böylece size bağlı. Eğer gerçek bir nesne başlatmasını iseniz ancak, bu artık çalışmıyor. List<? extends InterfaceA> güzel, ama List<? extends InterfaceA & InterfaceB> derlemek için başarısız olur. Aşağıdaki tam parçacığını göz önünde bulundurun:

import java.util.List;

public class Test {

  static interface A {
    public int getSomething();
  }

  static interface B {
    public int getSomethingElse();
  }

  static class AandB implements A, B {
    public int getSomething() { return 1; }
    public int getSomethingElse() { return 2; }
  }

  // Notice the multiple bounds here. This works.
  static class AandBList<T extends A & B> {
    List<T> list;

    public List<T> getList() { return list; }
  }

  public static void main(String [] args) {
    AandBList<AandB> foo = new AandBList<AandB>(); // This works fine!
    foo.getList().add(new AandB());
    List<? extends A> bar = new LinkedList<AandB>(); // This is fine too
    // This last one fails to compile!
    List<? extends A & B> foobar = new LinkedList<AandB>();
  }
}

bar semantiği tür güvenliği kaybı düşünemiyorum iyi tanımlanmış sadece bir yerine iki tür kavşak vererek olması gerektiği gibi görünüyor. Ama bir açıklaması vardır eminim. Herkes ne olduğunu biliyor mu?

CEVAP
11 Temmuz 2011, PAZARTESİ


İlginç olan, java.lang.reflect.WildcardType arabirim üst sınırları ve joker arg için alt sınır hem de bunu destekler gibi görünüyor; ve her biri birden fazla sınır içerebilir

Type[] getUpperBounds();
Type[] getLowerBounds();

Bu dili sağlar ne şekilde aşar. Kaynak kodu gizli bir yorum var

// one or many? Up to language spec; currently only one, but this API
// allows for generalization.

Arayüzü yazarı bu kaza sonucu bir sınırlama olduğunu kabul etmek gibi görünüyor.

Sorunuzun cevabı konserve, jenerik olarak zaten çok daha karmaşıktır, daha fazla karmaşıklık ekleyerek bardağı taşıran son damla olabilir.

Bir joker birden fazla üst sınırları etmek için bir spec ile tarama ve tüm sistem hala çalıştığından emin olmak için vardır.

Bildiğim tek sorun yazın çıkarım olurdu. Geçerli çıkarım kuralları sadece durdurma türleri ile anlaşma. 12* *kısıtlamasını azaltmak için kural yok. Bunun için düşürdük

    A<<C 
  or
    A<<B

herhangi bir geçerli çıkarım motoru büyük elden geçmesi gibi çatallanma izin vermek zorunda. Ama asıl ciddi sorun, bu farklı bir çözüm sağlar, ama başka bir tercih için bir neden yok.

Ancak, çıkarım tür güvenliği için gerekli değildir; yalnızca bu durumda anlaması ve programcı açıkça tür bağımsız değişkenleri doldurmak için sormak reddedebiliriz. Bu nedenle, analizde zorluk durdurma türlerine karşı güçlü bir argüman değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • MVLV28

    MVLV28

    17 Mart 2008