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
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. Derived2
s TbinList<Derived1>
etrafında yüzen ile sonunda olabilir.
Java Birden Fazla Sınıflar İle Joker K...
Java Jenerik (Joker)...
Java uyumlu joker zorlanarak Jenerik...
Java kullanarak.net.Ateş ve işlemek iç...
Neden belirli Unicode karakterler içer...