-3

如果 Java 允许静态和动态类型怎么办。这可能允许两全其美。IE:

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
}
4

8 回答 8

2

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

于 2008-09-19T03:47:02.103 回答
1

你能解释一下你的例子和

String str = "Hello";
Object temp = str;
temp = 10;
于 2008-09-19T03:35:15.017 回答
0

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

于 2008-09-19T03:43:43.983 回答
0

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

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

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

于 2008-09-19T03:44:23.717 回答
0

@Lou: It would be just syntactic sugar for:

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

I do use reflection, but I prefer it to be ugly so it's not abused.

于 2008-09-19T08:00:04.477 回答
0

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

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

于 2011-02-20T15:21:28.687 回答
0
  1. 那可能吗?
    几乎不。Java 是一种类 C 语言,最初设计为仅支持静态类型。将这个特性引入 Java 需要很多时间,我认为开发人员不会花时间在这上面。
  2. 那会有好处吗?
    不,Java 是一门传统语言,静态类型是基本原则之一或它的架构。事实上,静态类型在编程中仍然更流行(你可以在这里查看有趣的统计数据)。
  3. 目前是否有任何语言支持它,它的效果如何?
    嗯,有很多语言支持动态类型,但我想你知道这一点。如果该语言支持动态类型,那么将静态类型引入该语言是没有意义的......

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

于 2008-09-19T07:33:19.780 回答
0

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

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

如果您想要正确的动态类型,但仍想成为 Java 生态系统的一部分,请查看支持动态类型的其他出色 JVM 语言之一:例如 Clojure 和 Groovy。

于 2011-02-20T14:21:06.000 回答