2014-05-15 10 views
5

Java 1.6 Android projem var. Diyor'<>' işletmecisi 1.6'da 1.7'nin altında bir kaynak seviyesinde nasıl kullanılabilir?

import org.springframework.http.HttpEntity; 
//... 
HttpHeaders requestHeaders = new HttpHeaders(); 
//... 
new HttpEntity<>(requestHeaders); 

: '<>' operatörü ben 1.7 projemi geçmek istemiyorum 1.7

altında kaynak seviyesi için izin verilmez ben derlemek olmayan bir üçüncü taraf kodu var. Ben

new HttpEntity<Object>(requestHeaders); 

o çizgiyi değişti ve şimdi iyi derler.

Ancak düzeltmem doğru mu? Java 1.7 boş parantez ile ne yapar?

yeni nesne HttpEntity<?> argüman kabul işleve O Güncelleme

. Tür çıkarım fikrini anlıyorum ama 1.7 kodlayıcısının verilen kod satırından ne anlama geldiğini anlamıyorum.

+0

http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html –

+0

Yeni nesne nerede atandı? Bu değişken nasıl tanımlanır? – sidgate

+0

@ZouZou Teşekkürler, hala 1.7 derleyicisinin bu satırdan ne anlama geldiğini hala anlamıyorum. – Nick

cevap

4

Düzeltmeniz neredeyse doğrudur ve yine de tehlikeli değildir.

Object sıralamasının temelidir ve <> "derleyici türünü tahmin edelim" demektir, bu nedenle 1.7 in anlaşılmaktadır olurdu türlü zaten Object bir uzmanlık olacaktır.

Güncelleştirmeyi gördükten sonra: <?> aslında "joker karakter" anlamına gelir (see here), Object iyi.

8

Çizginin ilk bölümünü kaçırıyorsunuzdur, eminim ki bir HttpEntity onu atmak için yaratılmadı (referans kaydının türünü kontrol edin).

Java < 1.7 Bu gerektirir:

SomeGenericClass<String> foo = new SomeGenericClass<String>();

Java 1.7 kısaltma olarak bu sağlar:

SomeGenericClass<String> foo = new SomeGenericClass<>();

+0

Teşekkürler. Lütfen güncellenmiş soruya bakın. – Nick

1

Kişisel düzeltme doğrudur. HttpEntitiy'in tam (jenerik) türünü kullanmak daha iyi olacaktır.

<> işlecinin ardındaki fikir, derleyicinin genel türden kodun dolaylı olarak çıkabileceği yerlerde ayrıntıları azaltmaktır.

olarak bu post

The Diamond Operatörü tarif edilmiştir kurucular için derleyici anlaması parametre türlerini alarak Generics'i çevreleyen Java'nın ayrıntı bazı azaltır jenerik sınıflar

böyle ihtiyacı içinde Operatör, jenerik tiplerin yeni örneklerini ilan etme konusundaki ayrıntıdan geldi. derleyici kolayca nesnenin yapımında olmalıdır türünü anlayabileceği şekilde açıkça gereksiz

List<MyClass> myClassCollection = new List<MyClass>(); 

: Java sürümlerinde 1.7 önce jenerik bu şekilde tanımlamak zorunda kaldı.

java 1.7 önce::

public List<MyClass> getMyClassCollection() { 
    if(some condition) { 
     return new ArrayList<MyClass>(); 
    } else { 
     return LinkedList<MyClass>(); 
    } 
} 

java 1 sonra bu operatör ile birlikte gelir

bir diğer büyük gelişme genel bir tür geri dönüşüdür.7:

public List<MyClass> getMyClassCollection() { 
    if(some condition) { 
     return new ArrayList<>(); 
    } else { 
     return LinkedList<>(); 
    } 
} 

Bu önemsiz görünebilir, ama aslında bazı tür beyanları yedek hangi akışlar olabilir. Kodunuzu değiştirmek istediğinizde büyük avantaj gelir. Şimdi List<MyClassChild> (MyClassChildMyClass'u genişletir) yöntemini döndürdüğünüzde, 'un yalnızca bir yer değiştirmesi gerekir ve birkaç yer değil.

2

Elmas operatörünün, bir ödeve jeneriği tekrar tekrar yazmak zorunda kalmaması için gereksiz çabayı azalttığı düşünülmektedir.

yerine

ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<MyClassWithThatStupidLongName>(); 

sadece kullanabilirsiniz:

Ancak bu Java 7 tanıtıldı ve aynı edildi
ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<>(); 

daha düşük bir versiyonu için çalışan kod gerekir gibi görünüyor, sen olacak İlk girdiğim gibi tüm bu Jenerikleri tekrar eklemem gerekiyor.

İlgili konular