【问题标题】:Can a language be "complete" without explicit type casting?没有显式类型转换的语言可以“完整”吗?
【发布时间】:2012-03-25 07:23:09
【问题描述】:

如果不存在显式转换,编程语言能否“完整”?本质上,有没有什么是我们无法使用缺乏显式类型转换的语言做的?

例如,the post below 表明 Java 需要显式类型转换才能编写自定义的泛型类。

还有其他我们绝对需要显式转换的示例用例吗?

【问题讨论】:

    标签: java casting language-agnostic theory


    【解决方案1】:

    这里有一些

    要反转自动原始扩展:

    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");
    }
    

    编辑:“类型增加”更正为“原始扩展”。

    【讨论】:

    • “自动类型增加”不是真名,但想不到真名。
    • @DwB,我们不需要强制转换来执行 HTTP。如果我们使用写得不好的函数session.getAttribute,我们只需要强制转换。我说它写得不好,因为该函数只是返回Object 而不是更精确的类型。假设我们有函数session.getStringAttribute("x"),那么我们根本不需要显式类型转换,对吧?
    • 需要显式转换作为将超类型引用转换为子类型引用的一种方法;不过,我认为原语不需要它。 Java 可能借用了 C 对myInt = (int)myDouble; 的使用,但如果它改用myInt = Integer.Trunc(myDouble); [或Round,或Floor,或ConvertExact,它会是一种更好的语言,后者的操作会引发异常如果给定一个小数部分非零的double 值]。
    【解决方案2】:

    当然,以equals 方法为例——它必须得到Object 一个参数。 (并阅读this great chapter of Effective Java关于平等和朋友)

    【讨论】:

    • 但我们可以在不需要 equals 方法的情况下完成一切,不是吗?我从来没有发现自己需要使用 equals。没有它我们有什么不能做的吗?
    • 取决于你如何定义一切。没有它你不能使用大部分的收藏,但你可能会说它也是一个图书馆,在这种情况下,我唯一的答案是。是的,我们完全可以通过重写 Java 来避免强制转换。
    • 你从来没有比较过字符串吗?这也是equals的用法。
    • 看看 String 类的实现:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… 那里的转换是显式的。是您执行还是由其他人执行真的很重要吗?
    • 听起来你在问静态类型语言是否有可能在没有强制转换的情况下实现图灵完备。所以,答案是肯定的。然而,在 Java 中,强制转换通常是合适的(而且通常不是)。
    【解决方案3】:

    在 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

    【讨论】:

      【解决方案4】:

      在处理未考虑泛型构建的库时,或者当我需要向下转换某些对象以访问我知道由子类实现的功能时,我经常使用转换,但不是由我的类实现m 否则使用。与if (foo instanceof Bar) 核对可能是明智的 不过,在进行该演员之前的条款。

      【讨论】:

      • 这就是我要说的。假设我们不使用不利用泛型的库,为什么我们需要强制转换?
      • 我们当然会这样做,否则不会是语言。例如,假设我有一些我调用的方法,它会抛出“异常”——这不是最有用的,但它确实发生了。我可以做类似catch (Exception e) { if (e instanceof AxisFault) { System.err.println(((AxisFault) e).getFaultString()) } else { // do something different }}
      • 据我所知,它只是在语言中,因为直到很晚才会引入泛型。你有一些抛出“异常”的方法。发生这种事情的唯一原因是因为语言支持强制转换。我的意思是你明白我想说的吗?
      【解决方案5】:

      当我们反序列化一个对象(例如从一个字符串)时,我们需要将对象强制转换为类,以便我们可以使用它的方法。

      【讨论】:

      • 我经常使用XStream 进行序列化,我通常必须将从xstream.fromXML(xml) 方法收到的对象转换为我需要的类型。有没有比强制转换更好的方法?
      • 现在 better 确实是未定义的,但你知道,解析 xml 的方法有很多:en.wikipedia.org/wiki/XML#Programming_interfaces
      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多