我如何在java中展示强制(一种特殊的多态行为)?

时间:2012-04-18 17:17:07

标签: java polymorphism

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

当函数在几种不同的类型(可能不具有共同结构)上工作或看起来有效时,可获得Ad-hoc多态性,并且可能对每种类型以不相关的方式运行。有两种类型的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对我来说不是一个选项。

如果你有另一个表现出缩小的强制性例子,如果你和我分享,我将不胜感激:)

问候。

3 个答案:

答案 0 :(得分:3)

Nice reference here:“在Java中,如果强制将导致数据丢失,则必须始终显式地将数据元素强制转换为新类型。”

快速回答:你做不到。遗憾。

另一方面,编写那些不知道他们正在做什么的人不能解开的Java代码确实非常困难。

答案 1 :(得分:2)

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

double d = 12.6;
float f = d;

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

来自Java Language Specification

  

作业转换

     

当表达式的值为时,发生分配转换   赋值给变量:必须转换表达式的类型   到变量的类型。

     

分配上下文允许使用以下之一:

     
      
  • 身份转换

  •   
  • 扩大基元转换

  •   
  • 扩大参考转化

  •   
  • 一个拳击转换,可选地后跟一个加宽的引用转换

  •   
  • 一个拆箱转换,可选择后跟一个加宽的基元转换。

  •   

和该章的其他地方:

  

方法调用转换...执行与转换分配相同的转换。

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

答案 2 :(得分: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

所以答案比它看起来更模糊。