在Java中对方法参数施加约束,除了它们的数量和类型之外

时间:2017-08-13 18:28:16

标签: java methods arguments

我正在尝试定义一个返回数组的方法(称为“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;
}

2 个答案:

答案 0 :(得分:3)

您正在尝试静态(在编译时)确保后置条件取决于仅在运行时可用的信息。这个概念叫做dependent types。通常,依赖类型检查是不可判定的。因此,如果您有一种支持依赖类型检查的语言,则可以编写一个程序,其中类型检查器无法判断它是否类型正确。这种语言的一个例子是Idris,它类似于Haskell。 Idris是一种只应该用于研究的语言,以便了解依赖类型如何在编程中实际使用(依赖类型是自动定理证明中众所周知的概念)。

据我所知,没有类似Java的依赖类型检查这样的东西,因此你只能动态地(在运行时)检查前后条件,例如,如果发生意外情况,则抛出异常。

答案 1 :(得分:1)

使用类型系统(至少不是 java 类型系统)无法表达这一点。

您可以执行以下操作:

  • 拥有检查此类条件的代码 - 抛出IllegalArgumentException
  • 以类似的方式使用asserts(但这需要使用某些参数启动JVM)

含义:您可以进行运行时检查;但是对于“编译”而言。 “编程”时间 - 您只能提供非正式建议(例如关于方法合同的详细javadoc)。