我正在尝试定义一个返回数组的方法(称为“range”)。我传递两个整数,比如m和n,它返回一个长度为(n-m)的数组,如下面的清单所示:隐含地我认为n大于m。但我想明确地强加这个条件。 有没有办法在方法论证上强加这种条件?
您可能建议我更改方法,以便将m和(n-m)而不是m和n传递给方法,但它仍假定n-m是正整数。所以我们需要找到一种方法来对方法参数强加这些类型的约束。
public static int[] range(int m, int n) {
int[] r=new int[n-m];
for(int i=0; i<n-m; i++)
r[i]=m+i;
return r;
}
答案 0 :(得分:3)
您正在尝试静态(在编译时)确保后置条件取决于仅在运行时可用的信息。这个概念叫做dependent types。通常,依赖类型检查是不可判定的。因此,如果您有一种支持依赖类型检查的语言,则可以编写一个程序,其中类型检查器无法判断它是否类型正确。这种语言的一个例子是Idris,它类似于Haskell。 Idris是一种只应该用于研究的语言,以便了解依赖类型如何在编程中实际使用(依赖类型是自动定理证明中众所周知的概念)。
据我所知,没有类似Java的依赖类型检查这样的东西,因此你只能动态地(在运行时)检查前后条件,例如,如果发生意外情况,则抛出异常。
答案 1 :(得分:1)
使用类型系统(至少不是 java 类型系统)无法表达这一点。
您可以执行以下操作:
asserts
(但这需要使用某些参数启动JVM)含义:您可以进行运行时检查;但是对于“编译”而言。 “编程”时间 - 您只能提供非正式建议(例如关于方法合同的详细javadoc)。