从Java中的字符串构造泛型类的对象

时间:2016-11-26 20:40:16

标签: java generics

查看以下课程:

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,它们需要是整数。无论如何可能。

1 个答案:

答案 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)

所以你可以创建你想要的范围,使用任何格式来提供你想要的边界 - 你在调用构造函数之前构造lowerupper实例,这样你就可以自由地构造那些你怎么样。