2016-11-26 49 views
0

泛型类的对象看看下面的类:构建从字符串中的Java

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,那么它就可以工作。

有什么办法可以用这样的字符串构造这个类的对象,只有当T是int时。我怀疑是否有类似于C++中的类专业化的东西。

你得到我想要的,比方说那个字符串是“5 - 10”。我想低于5和10,他们需要整数。无论如何可能。

+0

如果你只想要整数,为什么有一个泛型?只需将'lower'和'upper'都设为'int'即可。 – Tunaki

+0

为什么你要使用**泛型**,当你有'int'的特定类型? – developer

+0

我已经为扩展Comparable的所有类型创建了这个类,但是我知道这个构造函数只能在成员是int时才能工作。如果T是浮动的,那么我想为这种情况设置特殊的范围(字符串范围)。 – Scarass

回答

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,不寒而栗)来表示每个边界,然后声明构造函数,像这样:

public Range(Optional<? extends T> lower, Optional<? extends T> upper) 

这样你就可以创建所需的范围内,使用任何格式提供你想要的边界 - 在调用构造函数之前,你构造了lowerupper实例,所以你可以自由构建你喜欢的方式。