2012-08-01 17 views
17

yöntemlerin argümanlar sadece başarısız nedeniyle tür kesmesi içinyöntemlere değerleri kısaca

// method declaration 
public void foo(Optional<String> arg); 

// compiler error 
foo(Optional.absent()); 

yazmak yerine eklemek zorunda olamayacağını olduğu gibi Guava en Optional türünü kullanarak ortaya çıkardığı bir sorun Açıkça yazın:

// real method call 
foo(Optional.<String> absent()); 

Nasıl önleyebilirim? sorusunu yazarken

+6

Gerçekten daha iyi bir yol yok, ancak FYI, 'İsteğe bağlı 'bir yöntem argümanı türünden daha çok bir dönüş değeri olarak kullanılma eğilimindedir. (Bir yöntemden bir dönüş değeri yazdığınız yönteme ilişkin bir argümanın null olabileceğini unutmak çok daha kolay.) –

+0

Karmaşık bir ifadeyle, uygun türde bir yerel değişken kullanıyorum (ödevin RHS'sinde) Daha okunabilir bir şey elde etmek için hiçbir tür değişkene gerek yoktur. Ancak burada, çözünürlük gelene kadar (muhtemelen JDK8) hiçbir şey yapılamaz. – maaartinus

+3

@LouisWasserman 'İsteğe bağlı' argüman olarak kullanmanın faydaları vardır: 1) Bir API'nın kullanıcılarına bir argümanın bulunamayacağını netleştirmek; 2) başka bir yöntemin dönüş değerini sizinkilere aktarmanızı kolaylaştırmak. –

cevap

-4

Sadece o zaman çağrı

@SuppressWarnings({ "unchecked" }) 
foo(GuavaConstants.ABSENT); 

daha iyi bir yaklaşım var mı benzeyebilir

public class GuavaConstants { 
    @SuppressWarnings({ "raw" }) 
    public static final Optional ABSENT = Optional.absent(); 

    // similar for empty ImmutableList, etc. 
} 

ve sahip düşündü?

+16

Evet, 'foo (İsteğe bağlı. yok())' daha iyi. Bu, bana yapman gereken bir şey gibi gelmiyor. – ColinD

+3

@ColinD, lütfen bunu bir cevap olarak yayınlayın, ben bir tanesi hemen çıkartacağım. Kabul edilen (ve sadece) cevap oldukça kötü. –

7

Eğer Optional<> türlerinden küçük bir set (örneğin, çoğunlukla dizeleri veya başka tür bir avuç) ile ilgili ise, sadece sizin için tür bağımsız değişkeni bağlayan bazı yardımcı yöntemler oluşturun:

public final class AbsentValues { 
    public static Optional<String> absentString() { 
     return Optional.<String>absent(); 
    } 
} 

yapabilirsiniz , daha az yaygın Optional<> türleri için

import static AbsentValues.*; 

... 

foo(absentString()); 

sadece açıkça tür bağımsız değişkeni belirtin: hatta daha temiz kod sonuçlanması statik bunlar ithal. Güzel olmayabilir, ama doğru.

-1

Bu, bunu yapmanın doğru yolu. Başka bir şey için değilse, en azından kendim gibi sorular okumayan herkes için gelecekteki referansım için burada göstermeme izin verin :) ColinD (ve Alexey) için teşekkürler.