Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以创建具有最小和最大范围的浮动类型?_Java - Fatal编程技术网

Java 是否可以创建具有最小和最大范围的浮动类型?

Java 是否可以创建具有最小和最大范围的浮动类型?,java,Java,我知道这可以在Ada中完成,但我是Java新手,不知道我是否能做到。我想把float子类型的弧度从0到2pi。超出范围的值将被视为超出范围并通过约束错误。感谢您的帮助 Java中没有内置Range对象,但您始终可以使用Apache Commons中的内容Commons.lang.math.Range只指定范围约束。它不代表该范围内的值(我认为这是您想要的) 您可以创建一个新类来保存值并强制执行约束。您自己的程序将传递该类的实例,从而获得类型安全性(强制执行约束)。调用其他API时,必须返回到发送

我知道这可以在Ada中完成,但我是Java新手,不知道我是否能做到。我想把float子类型的弧度从0到2pi。超出范围的值将被视为超出范围并通过约束错误。感谢您的帮助

Java中没有内置Range对象,但您始终可以使用Apache Commons中的内容

Commons.lang.math.Range只指定范围约束。它不代表该范围内的值(我认为这是您想要的)

您可以创建一个新类来保存值并强制执行约束。您自己的程序将传递该类的实例,从而获得类型安全性(强制执行约束)。调用其他API时,必须返回到发送和接受常规双精度值。在接受返回值之前,可以再次检查约束

public class Radian extends Number {

     private final double value;

     public Radian(double value){
          if (value < 0 || value >= 2 * PI)
               throw new IllegalArgumentException(value + " is out of range");
          this.value = value;
     }

     public double doubleValue(){
         return value;
     }

     // ... and other methods in the Number interface
     //   don't forget equals and hashCode and toString
}
公共类弧度扩展数{
私人最终双重价值;
公共弧度(双值){
如果(值<0 | |值>=2*PI)
抛出新的IllegalArgumentException(值+“超出范围”);
这个值=值;
}
公共双双值(){
返回值;
}
//…以及数字接口中的其他方法
//不要忘记equals、hashCode和toString
}

Java无法声明基元类型的类似Ada的子类型,特别是无法声明作为基元类型子范围的类型


在Java中,您所能做的最好的事情就是为基本类型创建一个自定义包装类,并让包装器使用(纯)运行时检查来强制执行范围约束。

如果您的所有代码都专门使用包装器,那么您几乎可以获得编译时类型安全性。当然,它必须与外部接口的部分必须依赖于运行时检查;e、 g.将两个受约束的数字相加时。在Java中,这些检查只能在运行时执行。在Ada中,智能编译器可以在编译时进行一些检查;e、 在涉及范围类型的常量表达式中。为什么希望它是不可变的?只是好奇。@vlad003:为什么要让它变为可变的?JDK中的所有数字类都是不可变的。我不得不使用extends而不是implements,但除此之外,这也起到了预期的作用。非常感谢。