【问题标题】:is Java weak typed as this example demonstrates when compared with python?与 python 相比,Java 是弱类型吗?
【发布时间】:2013-09-02 14:11:10
【问题描述】:

我熟悉什么是强类型和弱类型。我也知道 Java 是强类型的。 现在我学习python,它是一种强类型语言。但是现在我看到 python 比 Java 是“更多”的强类型。举例说明

public class StringConcat {

  public static void main(String[] args) {
      String s="hello ";
      s+=4;
    System.out.println(s);
}
}

没有错误并打印 hello 4

在python中

>>> x="hello"
>>> x+=4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

所以这个例子展示了python是强类型的。除非 Java 在底层,做一些操作将 int 转换为 String 并执行 String concat。

【问题讨论】:

  • 除非 Java 在底层,做一些操作将 int 转换为 String 并执行 String concat。 是的。
  • 字符串连接在 Java 中是一种非常特殊的情况。 JLS 中有一种语言说“+”运算符会发生自动转换(使用toString)(这适用于+=,正如 Prashant 指出的那样),但是没有其他类似的情况可以进行这种转换“不相关”类型之间发生。我不会因为这个规则例外而称 Java 为“弱类型”。

标签: java python string string-concatenation strong-typing


【解决方案1】:

尽管有你的例子,Java 仍然是强类型的。代码相当于

String s = "hello ";
s = s + 4;

Java 会将4 转换为字符串,然后执行字符串连接。这是一项语言功能。

但是,在 Python 中,您不能使用 +4 连接到您的字符串,因为该语言不会随意将其转换为 str。正如您所指出的,Java 会在后台为您做到这一点。

【讨论】:

    【解决方案2】:

    这个例子并不能证明 Java 不是强类型的。幕后只是隐含的string conversion (JLS, Section 5.1.11)

    首先,转换为引用类型以从 int 文字 (new Integer(4)) 创建 Integer,然后调用 toString() 将其转换为 String 以进行连接。

    【讨论】:

    • 我认为这不需要拳击。在自动装箱之前我不在,但我认为当时的代码仍然有效。此外,StringBuilderappend overloads for primitives
    • @user2357112 我提供的 JLS 链接没有提及拳击,它只是“转换为参考值”。我已经改变了答案的那一部分。
    • @user2357112:JLS 的定义是,当 + 用于 String 和其他东西时,toString() 方法会在其他操作数上调用——而像 int 这样的原语没有toString() 或任何其他方法。所以它必须被“装箱”(或任何你想称之为的)到一个对象。可能是 JLS 在自动装箱之前有一些特殊的语言来处理这种情况——我不知道。
    • 看起来像 JLS mentions that implementations are free to optimize away unnecessary conversions,但它根据等效的、效率较低的实现来定义结果。实际的 JVM 不会创建中间的 IntegerString 对象。
    【解决方案3】:

    如果你想要另一个有趣的例子,你可以在很多地方找到丑陋的

    intNumber+""

    将数字转换为字符串。程序员很懒,不想写

    Integer.toString(intNumber)

    这会在运行时导致字符串转换和无用的字符串连接。

    这并不意味着Java不是强类型的,只是所有的对象都需要一个toString()方法,并且所有的原语都可以自动装箱和拆箱到它们的非原语对应物(int -> Integer, long -> Long etc..) 实现了 toString(),而 java 中的 "+" 充当字符串连接。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2020-02-19
      • 2010-10-05
      • 2011-10-20
      • 2014-12-13
      • 2015-01-01
      • 2013-12-25
      • 2018-05-20
      相关资源
      最近更新 更多