- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
查看以下类(class):
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;
}
}
在构造函数中,我尝试从字符串构造一个对象。创建对象包含的值在字符串范围内。该字符串的格式类似于从 toString 方法返回的字符串。
这不会那么容易工作,错误出现在构造函数的最后两行,它说:“类型不匹配:无法从 int 转换为 T。”当然...因为T类型是由用户决定的,而Scanner.nextInt()总是返回int。即使这可行,它也只有在 T 为 int 时才有效。但假设当 T 为 int 时它才起作用,我就可以了。
只有当 T 为 int 时,有什么方法可以用这样的 String 构造此类的对象。我怀疑是否存在类似于 C++ 中的类特化的东西。
你明白我想要的了吗,假设该字符串是“5 - 10”。我希望下限为 5,上限为 10,并且它们必须是整数。无论如何都有可能。
最佳答案
一般执行此操作的一种方法是提供 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)
这样你就可以创建你想要的范围,使用任何格式来提供你想要的边界 - 你构造 lower
和upper
在调用构造函数之前创建实例,因此您可以自由地按照您喜欢的方式构造这些实例。
关于java - 在Java中从字符串构造泛型类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40822909/
我是一名优秀的程序员,十分优秀!