gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:12:53 25 4
gpt4 key购买 nike

查看以下类(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>它允许您解析 StringT 的实例.

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在调用构造函数之前创建实例,因此您可以自由地按照您喜欢的方式构造这些实例。

关于java - 在Java中从字符串构造泛型类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40822909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com