[英]Error converting Optional<String> to Integer from TextInputDialog
在这个例子中,我有 tempSocket1 和 tempSocket2,但我真的只想要其中之一。 我只是将两者都包括在内,以表明我尝试了两种方法,但我一直收到错误消息,“Integer 类型中的方法 valueOf(String) 不适用于参数(可选)。” 我认为这两种方法都是用于将字符串数据类型转换为整数的方法,但我不确定 Optional 部分如何改变整个系统。
private void showTextInputDialog() {
TextInputDialog changePort = new TextInputDialog("Settings");
changePort.setHeaderText("Change Port");
changePort.setContentText("Please enter port number to be used for establishing connection...");
Optional<String> result = changePort.showAndWait();
result.ifPresent(e -> {
Integer tempSocket1 = Integer.valueOf(result);
Integer tempSocket2 = Integer.parseInt(result);
}
);
}
要将 Optional 转换为 Integer,必须在转换前调用 get() 方法。
Optional<String> cadena = Optional.of("333");
Integer num = Integer.valueOf(cadena.get());
你看, Integer.valueOf
和Integer.parseInt
方法需要一个String
类型的参数,但你传递的是一个Optional<String>
。 所以这就是错误发生的原因。 可选字符串和字符串不一样。
试想想,如果Optional<String>
分别为相同String
,将ArrayList<String>
是相同的String
? LinkedList<String>
和String
吗? HashMap<String, Integer>
怎么样? 它既是String
又是Integer
吗?
将泛型类型与泛型类型参数一样对待会带来的混乱是破坏性的! 想象一下在可选字符串上调用charAt
! 没有实施,没有人知道会发生什么......
所以是的,永远不要认为泛型类型与泛型类型参数是相同的类型。
您正在尝试传递Optional<String>
而不是普通的String
。 在将结果转换为整数之前,您需要先使用.get()
获取字符串。 或者使用 result.ifPresent(e ...) 将自动解包可选值并将其转换为整数。
Optional<String> result = changePort.showAndWait();
result.ifPresent(e -> {
Integer tempSocket1 = Integer.valueOf(e);
Integer tempSocket2 = Integer.parseInt(e);
}
);
只是为了扩展其他答案,使用map
方法可能看起来更好,使用 lambda 和方法引用甚至更多:
Optional<String> result = changePort.showAndWait();
Integer tempSocket = result.map(Integer::valueOf).orElse(8080);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.