Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java更改为同时支持静态和动态类型是否有用?_Java_Language Design - Fatal编程技术网

将java更改为同时支持静态和动态类型是否有用?

将java更改为同时支持静态和动态类型是否有用?,java,language-design,Java,Language Design,如果Java同时允许静态和动态类型呢。这可能会让两个世界都变得最好。i、 e: String str = "Hello"; var temp = str; temp = 10; temp = temp * 5; 那可能吗 那会有好处吗 目前有任何语言同时支持这两种语言吗?其效果如何 下面是一个更好的示例(不能使用泛型,但程序确实知道类型): 你能解释一下你的例子和你的例子之间的区别吗 String str = "Hello"; Object temp = str; temp = 10; 动态

如果Java同时允许静态和动态类型呢。这可能会让两个世界都变得最好。i、 e:

String str = "Hello";
var temp = str;
temp = 10;
temp = temp * 5;
  • 那可能吗
  • 那会有好处吗
  • 目前有任何语言同时支持这两种语言吗?其效果如何
  • 下面是一个更好的示例(不能使用泛型,但程序确实知道类型):


    你能解释一下你的例子和你的例子之间的区别吗

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

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

    更加可控。是的,这将是有益的,但不是您所展示的示例。我想这样会更好

    public void f(var o)
    {
       o.method();
    }
    
    我可以使用名为method()的方法调用任何对象,而无需引入接口。这对于有约定但不一定有接口的地方很好。它对于与具有动态分派的语言进行互操作也很有用。

    C#有一个“var”关键字,按照您描述的方式使用,但它最终是一个强类型变量,基于类型检查建议的值类型

  • 有可能吗?
    几乎没有。Java是一种类似C的语言,最初设计时只支持静态类型。将这一特性引入Java需要很多时间,我认为开发人员不会花时间在这方面
  • 这会有好处吗?
    不,Java是一种传统语言,静态类型是它的基本原则或体系结构之一。事实上,静态类型在编程中仍然比较流行(您可以查看有趣的统计数据)
  • 目前有任何语言支持这一点吗?其效果如何?
    嗯,有很多语言支持动态类型,但我想你知道这一点。如果该语言支持动态类型,那么在该语言中引入静态类型是没有意义的

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

    @Lou:这只是语法上的甜点:

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

    我确实使用反射,但我更喜欢它是丑陋的,这样它就不会被滥用

    动态类型当然有它的用途

    然而,我认为将其添加到Java中是没有意义的,因为Java被设计为一种静态类型的语言,在这一点上尝试嫁接动态类型将是一个太大的哲学和体系结构转变

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

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


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

    这实际上不会编译,因为int不是object的子类。通常,动态的意思是可以调用var上的方法,如果运行时类型有该方法,这些方法就可以工作。因此,在您的情况下,如果没有强制转换,调用temp.length()将无法工作。动态意味着运行时类型检查,而不是编译时。我添加了一个更好的示例,希望它能更好地显示其好处。2:仅仅因为它是以一种方式设计的,并不意味着它以另一种方式不会有好处。这种逻辑可能会阻止许多最近的更改——泛型、for each、enum等等。3:对不起,我不清楚——这意味着一种语言同时支持这两种语言。对不起,我的坏例子——我添加了一个更好的例子。这种逻辑可以用来说,任何危险的东西都应该很难避免滥用。因为循环、线程等可能会被滥用,所以你认为它们也应该很难实现吗?可能是--可能可以实现它而不进行反射--关键是有些语言(LISP、python、Ruby)完全是基于此构建的,它们的用户发现它很有用--我认为Java中也是如此(对于某些应用程序)Java的一个特性是缺少特性。爪哇让你很难用脚射自己。而且,糟糕的程序员也会发生。。。使用坏代码也会发生。使用动态类型,Java将达到新的错误代码级别。。。。那会破坏一切。
    void doSth(Object foo) throws Exception{
            Method m = foo.getClass().getMethod("foo", String.class);
            m.invoke(foo, "baz");       
    }