- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试在 Scala 中使用泛型类型时遇到了困难。这是我的代码片段。
import scala.reflect.ClassTag
class test[A:ClassTag] {
private val arr: Array[A] = Array.tabulate(10){ x=>
((1.0 + x) / 5.0).asInstanceOf[A]
}
def apply(i: Int): A = arr(i)
}
val obj = new test[Float]
println(obj(1))
这段代码会抛出一个错误
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Float
at scala.runtime.BoxesRunTime.unboxToFloat(scratch_1.scala:105)
at scala.collection.mutable.ArrayBuilder$ofFloat.$plus$eq(scratch_1.scala:460)
at scala.Array$.tabulate(scratch_1.scala:327)
at #worksheet#.test.<init>(scratch_1.scala:4)
at #worksheet#.obj$lzycompute(scratch_1.scala:11)
at #worksheet#.obj(scratch_1.scala:11)
at #worksheet#.#worksheet#(scratch_1.scala:11)
当 A = Double 类型时,代码会给出 Double 类型的输出。
但是当 A = Float 类型时,就会抛出这个错误。
此处的任何反馈都非常有用。
最佳答案
您可以通过将 @specialized(Float)
添加到 A: ClassTag
类型参数来解决此问题。
这是您的代码的稍微简化的版本,其中添加了 @specialized(Float)
标记。 (我还添加了 @specialized(Int)
以使示例更加完整。)
import scala.reflect.ClassTag
class Test[@specialized(Float, Int) A: ClassTag] {
def apply(count: Int): Array[A] = Array.tabulate(count) {
i => (1.5 + i).asInstanceOf[A];
}
}
val floatTest = new Test[Float];
println(floatTest(5).mkString(", ")); // 1.5, 2.5, 3.5, 4.5, 5.5
// Works because code is specialized for float
// and primitive double is cast to primitive float.
val doubleTest = new Test[Double];
println(doubleTest(5).mkString(", ")); // 1.5, 2.5, 3.5, 4.5, 5.5
// Works although code is not specialized for double
// but Double object can be cast to Double object.
val intTest = new Test[Int];
println(intTest(5).mkString(", ")); // 1, 2, 3, 4, 5
// Works because code is specialized for int
// and primitive double is cast to primitive int.
val longTest = new Test[Long];
println(longTest(5).mkString(", ")); // ClassCastException
// Fails because code is not specialized for long
// and Double object cannot be cast to Long object.
// Works if you add @specialized(Long).
(从 Double 对象到 Double 对象的无操作转换称为 identity conversion。)
您还可以省略 @specialized
中的类型列表。在这种情况下,该类将专用于所有原始类型:
class Test[@specialized A: ClassTag] {
...
请注意,这会生成更多的类文件。例如,如果所有 Scala 集合类都专门用于所有原始类型,the Scala language library would suddenly become about ten times as large .
根本问题在于:装箱图元的转换规则与未装箱图元的转换规则非常不同。
在这种情况下(使用 Java 语法):
double d = 1.0 / 5.0; // 0.2 as a double primitive value
float f = (float)d; // 0.2f as a float primitive value
按预期工作。从 double
到 float
的转换称为 narrowing primitive conversion .
但这行不通:
java.lang.Double d = 1.0 / 5.0; // 0.2, but in a java.lang.Double object
java.lang.Float f = (java.lang.Float)d; // ClassCastException
从 java.lang.Double
到 java.lang.Float
的缩小或扩大转换是不可能的,因为两者都不是另一个的子类,并且装箱和拆箱转换也不适用。更准确地说,第一行有从double
到java.lang.Double
的隐式装箱转换,但第二行没有应用隐式装箱或拆箱转换。
Scala 使问题更加困惑,因为它试图隐藏区别 - Scala 只有类型 Double
,但没有类型 double
。根据上下文,Scala 类型 Double
有时(我认为大部分时间)映射到 Java 原始类型 double
,有时映射到 Java 引用类型 java .lang.Double
.
关于java - 无法在泛型类中将 Double 转换为 Float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51537609/
下面的代码有效,我觉得double(double)和double(*)(double)没有区别,square和 &square,我说得对吗? #include double square(doubl
我知道我的作业很草率,这是我在这门课上的第 4 次作业。任何帮助将不胜感激,谢谢。 double getPrincipal(0); double getRate(0); double getYe
我遇到了那个错误,当我使用类时,我在使用函数指针时遇到了这个错误。我的函数'ope'函数我该如何解决 evaluator::function(){ double (*ope) (dou
问题://故事从哪里开始 Graphics 类型中的方法 drawLine(int, int, int, int) 不适用于参数 (double, double, double, double) g.
我有一张 map> m1 形式的 map .我可以将其复制到 map m2 形式的 map 吗?这样键是相同的,并且 m2 中的值是 get(m1->second) 不使用循环?谢谢! 最佳答案 这样
有没有办法获取vector> 的“.first”和“.second”的连续内存? ?我的意思是: void func(int N, double* x, double* y) { for (i
我正在尝试将自定义 lambda 传递给需要函数指针的函数(更准确地说是 zero 中的 Brent library 函数)。 我的想法是,我将使用参数创建一次 lambda,然后用多个值对其求值 x
这是一个很简单的问题,让我很困惑。 我收到一个源文件的以下错误,但另一个没有: 4 src/Source2.cpp:1466: error: no matching function for cal
struct CalculatorBrain { private var accumulator: Double? func changeSign(operand: Double) -
在我正在进行的项目中,我尝试使用 curlpp库来发出一个简单的 html GET 请求。当我将 cpp 文件传递给 g++ 时,出现以下错误: /usr/local/include/curlpp
不使用double就能获得quadruple精度超过16位的数字吗?如果可能的话,这取决于编译器还是其他?因为我知道有人说他使用double精度,并且具有22位精度。 最佳答案 数据类型double
我正在寻找有关特斯拉 GPU 中硬件如何实现 double 的信息。我读到,两个流处理器正在处理单个 double 值,但我没有找到 nvidia 的任何官方论文。 提前致谢。聚苯硫醚为什么大多数 G
这个问题在这里已经有了答案: Passing capturing lambda as function pointer (10 个答案) 关闭 2 年前。 我有这个错误 error: cannot
情况:我有一个元组列表,其中添加了一个元组: List> list = new List>(); list .Add(new Tuple(2.2, 6.6)); 一切似乎都还好。但是......在 D
我有一个 JList,里面有一堆名字,还有一个包含这些名字值的数组 final Double[] filmcost = { 5.00, 5.50, 7.00, 6.00, 5.00 }; 我想做的是,
我试图找出牛顿法来求方程的根。这个错误出来了,我无法处理。 double fn(double n){ return sin(n)+log(n)-1; } double f1n(double n
我有一个 junit 测试断言两个 Double 对象,具有以下内容: Assert.assertEquals(Double expected, Double result); 这很好,然后我决定将其
我正在尝试引入部分数据文件来填充数组,用户尝试了三次输入正确的数据文件名。我一再遇到这些错误。我知道像 arr 这样的数组只是一个指向内存块的指针。 #include #include #incl
我正在尝试完成复习题(为即将到来的编程决赛),但是,我无法解决这个问题,因为我不断收到错误(标题)。正如预期的那样,我将发布问题和我尝试的解决方案。 问题: 给定以下函数定义:void swap(do
任何人都知道如何实现这一目标。我已经尝试了通常的公式,但我只得到正数 Double.NEGATIVE_INFINITY) return d; } } 这将以相同的概率
我是一名优秀的程序员,十分优秀!