2017-11-20 170 views
7

Java 1.8.0_151 kullanıyorum ve derleme değil bazı kod var ve ben anlamıyorum: o result1 üzerinde çalışıyor ancak result3 üzerinde derleme hatası veriyor nedenJava8 jenerik bulmaca

Optional optional = Optional.of("dummy"); 
Optional<Boolean> result1 = optional.map(obj -> true);  // works fine 
boolean result2 = result1.orElse(false);     // works fine 
boolean result3 = optional.map(obj -> true).orElse(false); // compilation error: Incompatible types: required boolean, found object 
Object result4 = optional.map(obj -> true).orElse(false); // works fine 

?
Ek bilgi: result1 ve result2 gibi result3 derlemek yapabiliyor: İlk satırda

  • , ben OptionalOptional<String> değiştirmek, result3 da ben 2 hat içine result3 kestiğinizde
  • derlemek yapabiliyor
+4

Olası kopyası [Ham tür nedir ve neden kullanmamalıyız?] (Https://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt -we-use-it) – Andrew

+2

@AndrewTobilko OP olabilir * bu amaçla * – Eugene

cevap

0

Teşekkür cevaplar için. Sadece resutl1 çalıştı neden ayrıntılarını ancak result3 üzerinde vermek istiyorum:

result1 üzerine
Optional<Boolean> result1 = optional.map(obj -> true);  // works fine 
boolean result2 = result1.orElse(false);     // works fine 
boolean result3 = optional.map(obj -> true).orElse(false); // compilation error: Incompatible types: required boolean, found object 

, optional değişken ham tipi, böylece optional.map(obj -> true) bir Optional çiğ türü döndürdü.Ham bir tip Optional nesne ham türü ile bu davranışın bir başka örneği .orElse(false)

diyemezsin çünkü Optional çiğ tip otomatik Öte yandan Optional<Boolean>
için
dökme Optional<Boolean> result1 oldu ilan

, optional.map(obj -> true).orElse(false); başarısız olduğu :

List li = new ArrayList<String>(); 
List<String> li1 = li; 
List<Integer> li2 = li; 
List<Map> li3 = li; 

li1.add("WWW"); 
li2.add(444); 
li3.add(new HashMap()); 

, tüm senaryolar için li nesne wi iyi çalışır Bir String, bir Tamsayı ve bir HashMap() içerir. li1, li2, li3, otomatik olarak ham olmayan türlere dökülmüştür.

4

optional çok optional.map(obj -> true) ham Optional döndürür ve orElse(false) döner, ham Optional olduğu Object, Boolean değil. Derleyici, Object'un boolean ürününün nasıl kaldırılacağını bilmez. Şimdi optional.map(obj -> true) bir Optional<Boolean> dönecek ve orElse(false) bir Boolean dönecektir beri

Optional<Object> optional = Optional.of("dummy"); 

veya

Optional<String> optional = Optional.of("dummy"); 

bu hatayı üstesinden gelecektir için

Optional optional = Optional.of("dummy"); 

değiştirerek

.

+0

İsteğe bağlı.map (obj -> true) 'dan korkuyorum, 'ham' İsteğe bağlı 'değil,' İsteğe bağlı ' döndürmez çünkü satır: 'İsteğe bağlı result1 = optional.map (obj -> true);' iyi çalışıyor – HenryNguyen

+3

@Henry aslında bir tür için genel bir tür atanabilir. öyle. – Eran

+0

ohhhhhh wow Bunu bilmiyordum, teşekkürler! – HenryNguyen

8

Güvenlik türünü kaybettikten sonra - zincirleme aramalar kadar iyi değil. Bu Optional<Object> != Optional. Eğer

Optional optional = Optional.of("dummy"); 
optional.map() 

de gerektiği zaman map sadece belli bir Object dönecektir başka bir çiğ Function ve hiçbir şey, kabul edebilir.

doğru yolu türü bilgilerini eklemektir:

Optional<String> optional = Optional.of("dummy"); 

Yoksa unsafely yayınlayabileceğim:

boolean result3 = (boolean) optional.map(obj -> true).orElse(false)