【问题标题】:Would it be useful to change java to support both static and dynamic types? [closed]将 java 更改为同时支持静态和动态类型是否有用? [关闭]
【发布时间】:2010-09-11 02:08:34
【问题描述】:

如果 Java 同时允许静态和动态类型会怎样。这可能允许两全其美。即:

String str = "Hello";
var temp = str;
temp = 10;
temp = temp * 5;
  1. 这可能吗?
  2. 这会有帮助吗?
  3. 目前是否有任何语言支持这两种语言?效果如何?

这是一个更好的例子(不能使用泛型,但程序确实知道类型):

var username = HttpServletRequest.getSession().getAttribute("username");//Returns a String
if(username.length() == 0) {
    //Error
}

【问题讨论】:

  • ...这会破坏一切

标签: java language-design


【解决方案1】:

动态类型语言使编码更简单、更快捷,但这样做的代价是将错误从编译时(很容易找到)推到运行时(很难找到且不可预测)。如果 Java 引入它并且它变得流行,我会寻找另一种更关心代码质量和我的时间的语言。

作为 Java 工作的前端,我在工作中进行了很多 Flex 开发,当我使用带参数的 Flex 方法工作时,开发人员大部分时间都使用 Object,这让我感到非常沮丧。对于参数类型,如果不运行带有断点的程序并希望我已经测试了对该方法的所有可能调用,我完全不知道它将具有哪些属性/方法。即使他们为参数使用了特定的类,也不能说没有添加或删除属性/方法。

【讨论】:

    【解决方案2】:

    动态类型当然有它的用途。

    但是,我认为将其添加到 Java 中没有意义 - Java 被设计为静态类型语言,此时尝试和移植动态类型将是一个太大的哲学和架构转变。

    如果你想要正确的动态类型但是 仍然想成为 Java 的一部分 生态系统,看看其中一个 其他伟大的 JVM 语言 支持动态类型:例如Clojure 和 Groovy。

    【讨论】:

      【解决方案3】:

      @Lou:这只是语法糖:

      void doSth(Object foo) throws Exception{
              Method m = foo.getClass().getMethod("foo", String.class);
              m.invoke(foo, "baz");       
      }
      

      我确实使用反射,但我更喜欢它是丑陋的,所以它不会被滥用。

      【讨论】:

      • 这个逻辑可以用来说所有危险的东西都应该难以避免滥用。 for 循环、线程等可能会被滥用,所以你认为它们也应该很难吗?
      • 它可能是——它可能无需反射就可以实现——关键是某些语言(LISP、python、Ruby)完全建立在此之上,并且他们的用户发现它很有用—— - 我认为在 Java 中也是如此(对于某些应用程序)
      • Java 的一个特点是缺乏特点。 Java 让你更难自爆。而且,糟糕的程序员会发生......并且使用糟糕的代码会发生。使用动态类型,Java 将达到新的糟糕代码水平。
      【解决方案4】:
      1. 这可能吗?
        几乎不。 Java 是一种类 C 语言,最初设计为仅支持静态类型。将此功能引入 Java 需要很长时间,我认为开发人员不会花时间在这上面。
      2. 这会有帮助吗?
        不,Java 是一门传统语言,静态类型是基本原则之一或它的架构。事实上,静态类型在编程中还是比较流行的(你可以查看有趣的统计数据here)。
      3. 目前是否有任何语言支持该功能?效果如何?
        嗯,有很多语言支持动态类型,但我想你知道这一点。如果该语言支持动态类型,那么在该语言中引入静态类型就没有任何意义...

      此外,您在示例中展示的功能可以通过静态类型来实现。 jon 给了你一个 Java 中的“Object”类的例子。您可以在 C/C++ 中使用 void* 进行类似操作。尽管如此,这并不能使语言动态类型化。

      【讨论】:

      • #2:仅仅因为它是以一种方式设计的,并不意味着它不会以另一种方式有益。这种逻辑会阻止最近的许多变化——泛型、for each、枚举等。#3:对不起,我不清楚——意味着一种支持两者的语言。
      【解决方案5】:

      C# 有一个以您描述的方式使用的“var”关键字,但它最终成为一个强类型变量,基于类型检查建议将进入其中的值的类型。

      【讨论】:

        【解决方案6】:

        是的,这将是有益的,但不适用于您展示的示例。我认为这样的事情会更好

        public void f(var o)
        {
           o.method();
        }
        

        并且我可以使用名为 method() 的方法对任何对象调用 f,而无需引入接口。对于有约定但不一定有接口的地方来说,这很好。它对于与具有动态调度的语言的互操作也很有用。

        【讨论】:

        • 对不起我的坏例子——我添加了一个更好的例子。
        【解决方案7】:

        动态类型变量只有 Universal 类型,因此其他所有类型都是 Universal 的子类型。所有类型都继承自这种通用类型的任何语言(例如 Java 模未装箱值)已经具有此功能。至于有用性 - 取决于你在做什么。我更喜欢一个完全静态的类型系统,它很容易创建安全的标记联合,因此我可以将我需要的任何值放入变量中,但以比 Universal 更可控的方式。

        【讨论】:

          【解决方案8】:

          你能解释一下你的例子和

          String str = "Hello";
          Object temp = str;
          temp = 10;
          

          【讨论】:

          • 这实际上不会编译,因为 int 不是 Object 的子类
          • 通常,动态的意思是可以在 var 上调用方法,如果运行时类型具有该方法,它们就会工作。因此,在您的情况下,如果没有演员表,调用 temp.length() 将无法工作。动态意味着运行时类型检查,而不是编译时
          • 我添加了一个更好的例子,希望能更好地展示它的好处。
          猜你喜欢
          • 2012-11-04
          • 2012-10-03
          • 2014-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-30
          • 1970-01-01
          相关资源
          最近更新 更多