2017-11-01 9 views
0

私は入力値を確認するためにdeNull()メソッドを作成しようとしています。これらの入力値は、String、int、double、Timestampです。したがって、ジェネリック型でメソッドを作成します。ジェネリック型のメソッドから値を入力して返す方法は?

入力値がNULLの場合、 ""が返されます。

入力値がNULLでない場合は、元の値を返します。

私のコードは以下の通りです:

public static <T> T deNull(T value){ 
    if(value == null){ 
     return ""; 
    } else { 
     return value; 
    } 
} 

しかし、この方法では、3行目でフリークアウトと型の不一致を示していますT.に文字列から変換できません

どのように私はこの方法を改正すべきですそれが期待通りに動くようにするには?

+1

からそれを切り離しますnone 'String'の場合に返されますか? '' 'は有効な' 'Integer''ではありません。 –

+0

String以外の値の入力で、nullでない場合は、元の値を返します。たとえば、入力番号88の場合は、88を返します。 –

+0

これはk5_が尋ねた質問ではありませんでした。 'T'が' Integer'で 'value'が' null'の場合、値は何になるでしょうか? '' ''にすることはできません。これはコンパイラがあなたに伝えていることです。 – Andreas

答えて

3

intdoubleは2つのだけのオプションとしてTimestampStringを残している、とにかくnullすることはできません。

私の意見では、ジェネリックスなしで両方の方法を書いてみると面倒なことではありません。

実際に2種類以上のタイプが必要な場合は、メソッドを変更することをおすすめします。

public static <T> T deNull(T value, T orElse){ 
    if(value == null){ 
     return orElse; 
    } else { 
     return value; 
    } 
} 

String x = deNull(string, ""); 
Integer y = deNull(integer, 0); 

「T」のあなたのライン3は、それが失敗している他の有効な文字列である場合

+0

'T'は' int'や 'double'にすることはできませんので、答えの一部は無関係です。 – Andreas

+1

これらのタイプは元の質問から来ました。 –

+0

質問が間違っていても、あなたの答えが正しいとは限りません。汎用型パラメータはプリミティブではありません。彼らはボックス化された同等かもしれません。 – Andreas

0

(私もvalueOrElseにメソッド名を変更することをお勧めします)。

return ""; 

Tは、整数の文字列は戻り値は常に文字列型であるので

Integer a = 5; 
String s = (String)a;//You cannot do like this 
+0

'T'は' int'にできません。 – Andreas

+0

ありがとうございましたAndreasが整数をintに編集しました – janith1024

2

を整数にキャストすることはできませんされている場合は、どうあるべきかのパラメータの型T

public static <T> String deNull(T value) { 
    if (value == null) { 
     return ""; 
    } else { 
     return value.toString(); 
    } 
} 
+0

あなたの提案に感謝します。これは、文字列の値だけを返したい場合には、素晴らしいアプローチになるかもしれません。 =) –

関連する問題