如果我写:
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?
答案 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")
它会自动推断出myList
是List[String]
类型的变量。
但这通常会导致不必要的结果。例如,给定赋值
var myList = List.empty
Scala编译器很乐意推断右侧是List[Nothing]
,其中Nothing
是一种特殊类型,表示由抛出异常和错误“返回”的荒谬不可能结果打破正常程序流。你不能对这个变量做任何事情。为了使这个变量有用,我们必须写:
var myList: List[String] = List.empty
现在,Scala编译器会理解myList
应该是List[String]
,这比从右侧推断的类型更通用。如您所见:现在左侧有val
个关键字和另外的List[String]
- 类型声明,它不一定比相应的Java版本短。它实际上是更长,尽管所有奇特的类型推理魔术。因此,Java的变量声明语法是......好吧,至少让它变得更好是不容易的。