我有以下示例:
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 bound(s): 数字 其中 Type#1,Type#2 是类型变量: Type#1 扩展了方法 add_specific(Type#1) 中声明的 Number Type#2 扩展了在方法 add(Type#2) 中声明的 Object 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
. 这个通用函数做一些通用的事情,并调用一个特定的函数来做一些特定的事情。问题是,选择特定函数的类型在泛型函数中丢失了。问题是如何解决这个问题?我如何编写泛型函数,以便仍然可以在泛型函数的主体中选择正确的特定函数?