【问题标题】:Is variable type the same as value type?变量类型和值类型一样吗?
【发布时间】:2018-07-21 11:37:16
【问题描述】:

如果我写:

int x = 7;

我们能否得出结论,7的值类型是int,因此x的类型也是int?

这里的'int'是什么意思?值是 int 还是 7 是 int?

【问题讨论】:

  • "我们能否得出结论,7 的值类型是 int,因此 x 的类型也是 int?"不,例如,x 的类型可能是 long。 “这里的'int'是什么意思?”x的类型...
  • 我们可以得出结论 7int 文字,因为 JLS 说它是。 long 文字以字母“l”为后缀。
  • 所以当我们写 int x = 7 时,我们实际上只是将变量标记为 int 对吗?
  • 你声明了一个变量,并明确告诉编译器它的类型是int
  • @Allan Java 源代码中的表达式7 的类型为int。这是在 JLS 中定义的。它可以显式转换为其他几种类型,并显式使用强制转换和方法调用转换为更多类型。

标签: java variables int


【解决方案1】:

int 指的是 x。它表示变量 x 的类型。这也提供了将存储在那里的值的类型的信息。

  int x =7;

由两部分组成。 一种是:

   int x;

在此范围内将 x 声明为 int。这表明 int 指的是 x。 表达式的另一部分是:

     x=7;

这实际上将 int 值 7 赋给 x。当然赋值需要是有效的。所以值应该是合适的类型。 在程序中省略赋值也是有效的(例如,如果您不使用此变量。) 另一方面,您不能省略声明,因为 java 是强类型的。 例如写作:

y=8;

除非声明 y,否则不会提供足够的信息。 y 可以是例如 int、Integer、long 或 Long。 y 是什么取决于它的声明。

【讨论】:

    【解决方案2】:

    表示变量x的类型为int

    表达式7 也恰好有int 类型,因此这个例子没那么有趣。

    考虑一个更有趣的例子:

    List<String> myList = new ArrayList<>();
    

    在这里,编译器可以推断出右侧的new ArrayList&lt;&gt;() 的类型是ArrayList&lt;String&gt;。然而,我们可能想要隐藏具体的实现类ArrayList,而是将myList 声明为更通用的类型List&lt;String&gt;,它是ArrayList&lt;String&gt; 的超类型。如果我们想防止类成员的抽象泄漏,或者如果我们使用 myList 作为局部变量,并且出于某种原因希望稍后将其设置为 LinkedList,这很有用。


    这就是我对问题本身要说的全部内容,但我想提供一些背景信息,并且我想争辩说 Java 当前的语法实际上并不算太糟糕。

    这种语法可能看起来很冗长,人们可能会认为通常可以省略左侧的类型声明。但是,请考虑一种具有更强类型推断的语言。 例如,密切相关的静态强类型语言 Scala 往往更多地依赖于类型推断。例如,如果你写

    var myList = List("foo", "bar")
    

    它会自动推断myListList[String] 类型的变量。

    但这通常会导致不需要的结果。例如,给定作业

    var myList = List.empty
    

    Scala 编译器会很高兴地推断出右侧是List[Nothing],其中Nothing 是一种特殊类型,表示通过抛出的异常和错误“返回”荒谬的不可能结果,这些异常和错误会破坏正常的程序流程。你不能对这个变量做任何事情。为了使这个变量有用,我们必须写:

    var myList: List[String] = List.empty
    

    现在 Scala 编译器会理解 myList 应该是 List[String],这比从右侧推断的类型更通用。如您所见:现在您在左侧有val 关键字和附加的List[String]-type 声明,它不一定比相应的Java 版本短很多。它实际上更长,尽管有所有花哨的类型推断魔法。所以,Java 的变量声明语法是……好吧,至少让它变得更好并不是一件容易的事。

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2020-04-19
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2020-04-21
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多