【发布时间】:2012-03-25 07:23:09
【问题描述】:
如果不存在显式转换,编程语言能否“完整”?本质上,有没有什么是我们无法使用缺乏显式类型转换的语言做的?
例如,the post below 表明 Java 需要显式类型转换才能编写自定义的泛型类。
还有其他我们绝对需要显式转换的示例用例吗?
【问题讨论】:
标签: java casting language-agnostic theory
如果不存在显式转换,编程语言能否“完整”?本质上,有没有什么是我们无法使用缺乏显式类型转换的语言做的?
例如,the post below 表明 Java 需要显式类型转换才能编写自定义的泛型类。
还有其他我们绝对需要显式转换的示例用例吗?
【问题讨论】:
标签: java casting language-agnostic theory
这里有一些
要反转自动原始扩展:
byte blammy = (byte)(schmarr & 0xF7);
遗留代码:
public void oldSchoolMethod(List oldSchoolListOfStrings)
{
String firstValue = (String)oldSchoolListOfStrings.get(0);
}
HTTP 代码:
public String getSchmarr(HttpServletRequest request)
{
HttpSession session = request.getSession();
return (String)session.getAttribute("Schmarr");
}
编辑:“类型增加”更正为“原始扩展”。
【讨论】:
session.getAttribute,我们只需要强制转换。我说它写得不好,因为该函数只是返回Object 而不是更精确的类型。假设我们有函数session.getStringAttribute("x"),那么我们根本不需要显式类型转换,对吧?
myInt = (int)myDouble; 的使用,但如果它改用myInt = Integer.Trunc(myDouble); [或Round,或Floor,或ConvertExact,它会是一种更好的语言,后者的操作会引发异常如果给定一个小数部分非零的double 值]。
当然,以equals 方法为例——它必须得到Object 一个参数。 (并阅读this great chapter of Effective Java关于平等和朋友)
【讨论】:
在 Java 中,无法声明泛型类型 T 的数组。例如使用new T[10]声明数组是无效的:
public class List<T> {
T[] backing_array = new T[10]; // this line is invalid,
public T Item(int index) {
return backing_array[index]; // and therefore this line is invalid as well.
}
//etc...
我们拥有的最佳替代解决方案是:
public class List<T> {
Object[] backing_array = new Object[10];
public T Item(int index) {
return (T) backing_array[index]; // notice that a cast is needed here if we want the return type of this function to be T
}
//etc...
如果 Java 中不存在显式类型转换,则无法构建泛型数组列表,因为不允许声明泛型类型的数组 T。
【讨论】:
在处理未考虑泛型构建的库时,或者当我需要向下转换某些对象以访问我知道由子类实现的功能时,我经常使用转换,但不是由我的类实现m 否则使用。与if (foo instanceof Bar) 核对可能是明智的
不过,在进行该演员之前的条款。
【讨论】:
catch (Exception e) { if (e instanceof AxisFault) { System.err.println(((AxisFault) e).getFaultString()) } else { // do something different }}
当我们反序列化一个对象(例如从一个字符串)时,我们需要将对象强制转换为类,以便我们可以使用它的方法。
【讨论】:
xstream.fromXML(xml) 方法收到的对象转换为我需要的类型。有没有比强制转换更好的方法?