SORU
21 Mayıs 2015, PERŞEMBE


Java Jenerik, bir sınıfın genişletilmesi ve joker karakterler kullanarak Bilinmez

Bir süre için bu bir karşı başımı dayak ve belki de yeni bir bakış açısına sorun görmeyeceğini düşündüm durdum, zaman ayırdığınız için teşekkürler.

import java.util.*;

class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<T>> {}

class Base {}
class Derived extends Base {}

public class Test {
  public static void main(String[] args) {
    ArrayList<Tbin<? extends Base>> test = new ArrayList<>();
    test.add(new Tbin<Derived>());

    TbinList<? extends Base> test2 = new TbinList<>();
    test2.add(new Tbin<Derived>());
  }
}

Java Kullanarak 8. test konteyner doğrudan oluşturma derleyici diyor ama test2: konteyner eşdeğer gibi görünüyor

Test.java:15: error: no suitable method found for add(Tbin<Derived>)
    test2.add(new Tbin<Derived>());
         ^

Nasıl son satırı kabul edilebilir Tbin TbinList yazmanın ne anlamı var?

Aslında son satırında Tbin<Derived>belirtilen yüzden yazılan Tbin s ekleyerek olacaktır unutmayın.

CEVAP
21 Mayıs 2015, PERŞEMBE


Bu capture conversion çalışma biçimini nedeniyle oluşur:

Parametrik türü ** 16 yaşında, nerede, için için parametrik türü G<T1,...,Tn> yakalama bir dönüşüm var1 r ı r n:

  • Eğer Ti ? extends Bi Si taze türü bir değişken biçiminde joker tipi bir değişken ise [...].

Yakalama dönüşüm yinelemeli olarak uygulanmaz.

Son bit not. Bu ne demek yani, böyle bir tip verilir:

    Map<?, List<?>>
//      │  │    └ no capture (not applied recursively)
//      │  └ T2 is not a wildcard
//      └ T1 is a wildcard

"" Joker yakalanır. dışarıda sadece Map anahtar joker yakalanır, ama List öğe joker değil. Bu, örneğin, List<List<?>> ama List<?> bir ekleyebiliriz neden olur. Joker yerleştirilmesi önemlidir.

Bu taşıma için TbinList, eğer var ArrayList<Tbin<?>> joker olduğu bir yere gelmez olsun yakalanan, ama eğer biz bir TbinList<?> joker bir yere esir alır.

Yorum için ima ettiğim gibi, çok ilginç bir test bu

ArrayList<Tbin<? extends Base>> test3 = new TbinList<>();

Bu hata ile karşılaşırız:

error: incompatible types: cannot infer type arguments for TbinList<>
    ArrayList<Tbin<? extends Base>> test3 = new TbinList<>();
                                                        ^
    reason: no instance(s) of type variable(s) T exist so that
            TbinList<T> conforms to ArrayList<Tbin<? extends Base>>

Olduğu gibi çalışması için bir yol var. Sınıf bildirimleri bir değiştirilmesi gerekiyor.


Ayrıca, bir de şu şekilde düşünün.

Biz varsayalım:

class Derived1 extends Base {}
class Derived2 extends Base {}

Ve bir joker kistlerinin alt tiplerinin belirlenmesindeki izin verdiği, bunu yapabiliriz:

TbinList<? extends Base> test4 = new TbinList<Derived1>();

test4 32 *ekleyebilir miyiz? Hayır, bu yığın kirlilik olur. Derived2s TbinList<Derived1> etrafında yüzen ile sonunda olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • Howcast

    Howcast

    4 EKİM 2007
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006