变量类型与值类型相同吗?

时间:2018-02-11 01:00:18

标签: java variables int

如果我写:

CREATE OR REPLACE FUNCTION the_func(
   rngstart timestamptz,
   rngdend timestamptz,
   _tablename VARCHAR(16),
   _id INT
) AS $$
   SELECT *
   FROM pg_attribute
   WHERE attrelid = _tablename::regclass
      AND id = _id
      AND time > rngstart
    AND time <= rngend
$$ LANGUAGE sql STABLE;

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

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

2 个答案:

答案 0 :(得分:2)

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。 什么是取决于它的声明。

答案 1 :(得分:1)

它表示变量x的类型为int

表达式7也恰好具有int类型,因此该示例并不那么有趣。

考虑一个更有趣的例子:

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

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

这就是我在问题本身上所说的全部内容,但我想提供一些背景信息,我想说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] - 类型声明,它不一定比相应的Java版本短。它实际上是更长,尽管所有奇特的类型推理魔术。因此,Java的变量声明语法是......好吧,至少让它变得更好是不容易的。