次の例があります。
class bounds
{
private StringBuilder str = new StringBuilder();
public <Type> void add (Type value)
{
add_specific (value);
str.append (String.format("%n"));
}
private <Type extends Number> void add_specific (Type value)
{
str.append (value);
}
public String toString () { return str.toString(); }
public static void main (String[] args)
{
bounds test = new bounds();
test.add (new Integer (42));
System.out.print (test.toString());
}
}
コンパイルしようとすると、次のエラーが発生します。
bounds.java:7: エラー: クラス境界のメソッド add_specific は、指定された型に適用できません。 add_specific (値); ^ 必須: タイプ#1 見つかった: タイプ#2 理由: 推論された型が宣言された境界に準拠していません 推測: タイプ#2 境界: 数値 ここで、Type#1、Type#2 は型変数です。 Type#1 extends Number 宣言メソッド add_specific(Type#1) Type#2 extends メソッド add で宣言された Object(Type#2) 1 エラー
add
これは、メソッドに渡された引数の元の型が の本体で失われたように見えますadd
。正しいadd_specific
メソッドを選択できるようにするにはどうすれば型を保持できますか?
アップデート
理解しやすいと思ったので、例を単純化しました。しかし、ほとんどの人は、ジェネリック関数と特定関数が含まれている理由を理解していないように思えます。そこで、より高度な例を貼り付けます。おそらく、これにより理由がより明確になります。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
class bounds
{
private StringBuilder str = new StringBuilder();
public <Type> void add (Type value)
{
add_specific (value);
str.append (String.format("%n"));
}
private <Type extends Number> void add_specific (Type value)
{
str.append (value);
}
private void add_specific (String value)
{
str.append ('"');
for (int i = 0; i < value.length(); i++) {
char ch = value.charAt(i);
switch (ch) {
case '\\': str.append ("\\\\"); break;
case '"': str.append ("\\\""); break;
default: str.append (ch);
}
}
str.append ('"');
}
private static DateFormat iso8601
= new SimpleDateFormat("'\"'yyyy-MM-dd'T'HH:mm:ssZ'\"'");
private void add_specific (Date date)
{
str.append (iso8601.format(date));
}
public String toString ()
{
return str.toString();
}
public static void main (String[] args)
{
bounds test = new bounds();
test.add (new Integer (42));
test.add ("42");
test.add (new Date());
System.out.print (test.toString());
}
}
という汎用関数がありadd
ます。この汎用関数は汎用的な処理を行い、特定の関数を呼び出して特定の処理を行います。問題は、特定の関数を選択する型がジェネリック関数で失われることです。問題は、これを修正する方法です。ジェネリック関数の本体で適切な特定の関数を選択できるようにするには、ジェネリック関数をどのように作成する必要がありますか?