0

由于java是一种面向对象的语言,它应该表现出多态性。以下是我对一种多态性的定义;ad-hoc 多态性,以及它的一个子类型;强迫。

当一个函数在几种不同的类型(可能不表现出共同的结构)上工作或似乎工作时,获得了临时多态性,并且可能以不相关的方式对每种类型表现。有两种类型的临时多态性,强制和重载。

强制转换是一种避免类型错误的语义操作。编译器将一种类型转换为另一种类型,以便将函数调用中的参数类型与函数定义中的参数类型相匹配。函数定义仅适用于一种类型。编译器在编译时实现强制。

我有这个例子在 C++ 中工作

#include <iostream>
 using namespace std;

 void display(int a) const
 {
     cout << "One argument (" << a
          << ')' << endl;
 }

 int main( )
 {
     display(10); // returns "One argument (10)"
     display(12.6); // narrowing // returns "One argument (12)"
 }

我试图在java中实现相同的程序但没有成功。

public static void display (int i)
{
  System.out.println("One argument (" + i + ")");
}

public static void main (String[] args)
{
  display(10); // One argument (10)
  display(12.6); // Narrowing (a type of coercion) takes place. One argument (12)
}

但我收到了错误。

The method display is not applicable for the arguments(double).

你知道如何成功转换。请注意,我真的希望使用编译器自动修复类型的强制技术。所以我用 (int) 12.6 转换为 int 对我来说不是一个选择。

如果您有另一个显示缩小的强制示例,如果您与我分享,我将不胜感激:)

问候。

4

3 回答 3

3

很好的参考: “在 Java 中,如果强制会导致数据丢失,您必须始终将数据元素显式转换为新类型。”

快速回答:你不能。对不起。

另一方面,要编写无法被知道自己在做什么的人挑选出来的 Java 代码是非常非常困难的。

于 2012-04-18T17:26:35.860 回答
2

简而言之,Java 不允许隐式缩小转换。因此,即使以下内容也无法编译:

double d = 12.6;
float f = d;

请注意,“宽度”(如“扩大”和“缩小”实际上是关于范围,而不是精度)。

来自Java 语言规范

作业转换

赋值转换发生在将表达式的值赋给变量时:必须将表达式的类型转换为变量的类型。

赋值上下文允许使用以下之一:

  • 身份转换

  • 扩大的原始转换

  • 扩大参考转换

  • 可选的装箱转换,然后是扩大的参考转换

  • 一个拆箱转换可选地跟随一个扩大的原始转换。

以及该章的其他地方:

方法调用转换...执行与赋值转换相同的转换。

您会注意到“缩小原始转换”不在该列表中。

于 2012-04-18T17:26:27.370 回答
2

Java 不允许缩小强制,而只是扩大强制。

所以允许:

float foo(float f) { return f*f; }

int i = 10;
float f = foo(i);
float f2 = i;

但不是在您将失去精确度时。

编辑:实际上,由于 java 中的浮点数是标准的 4 字节 IEEE754,您实际上确实会丢失精度,但在任何情况下都是允许的,这表明了这种行为:

int d = Integer.MAX_VALUE;
float f = d;
System.out.println(String.format("%d != %12.0f", d, f));

你将拥有:

2147483647 != 2147483648

所以答案比看起来要模糊一些。

于 2012-04-18T17:30:31.637 回答