查看以下课程:
public class Range<T extends Comparable<T>>
{
public T lower;
public T upper;
public Range(String range){
Scanner scanner = new Scanner(range);
if(scanner.hasNextInt())
this.lower = scanner.nextInt();
if(scanner.hasNextInt())
this.upper = scanner.nextInt();
}
public String toString(){
return lower + " - " + upper;
}
}
在构造函数中,我正在尝试从字符串构造一个对象。创建对象包含的值在String范围内。字符串的格式类似于从toString方法返回的字符串。
这不会那么容易,错误在最后两行构造函数上,它说:“类型不匹配:无法从int转换为T.” Ofcourse ...因为T类型由用户决定,而Scanner.nextInt()总是返回int。即使这样可行,它也只有在T为int时才有效。但是,让我说如果它在T为int时才有效。
有没有办法可以用这样的String构造这个类的对象,只有当T是int时才有。我怀疑在C ++中有类似于类专业化的东西。
你得到我想要的东西,让我们说字符串是“5 - 10”。我希望下限为5和上10,它们需要是整数。无论如何可能。
答案 0 :(得分:3)
一般来说,这样做的一种方法是提供一个Function<String, ? extends T>
,它允许您将String
解析为T
的实例。
public Range(String range, Function<String, ? extends T> parser){
Scanner scanner = new Scanner(range);
if(scanner.hasNext())
this.lower = parser.apply(scanner.next());
if(scanner.hasNext())
this.upper = parser.apply(scanner.next());
}
请注意,这种整体方法并不是特别好。首先,你不能创建一个只有上限的范围;另一方面,它限制您输入由Scanner
标记化的字符串;并且你最好制作你的字段final
,以获得给你的好房产。
最好在Range
类之外进行解析(或者,至少在构造函数之外)。例如,您可以使用Optional<T>
(或者null
,shudder)来表示每个边界,然后像这样声明构造函数:
public Range(Optional<? extends T> lower, Optional<? extends T> upper)
所以你可以创建你想要的范围,使用任何格式来提供你想要的边界 - 你在调用构造函数之前构造lower
和upper
实例,这样你就可以自由地构造那些你怎么样。