首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中展示强制(一种特殊的多态行为)?

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

Stack Overflow用户
提问于 2012-04-19 01:17:07
回答 3查看 630关注 0票数 0

因为java是一种面向对象的语言,所以它应该表现出多态性。下面是我对多态类型的定义:即席多态,以及它的一个子类型;强制。

当一个函数在几个不同的类型上工作或看起来工作时,就会获得Ad-hoc多态性(这可能不会表现出共同的结构),并且可能会以不相关的方式对每种类型进行操作。有两种类型的ad-hoc多态,强制和重载。

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

我有一个在C++中工作的例子

代码语言:javascript
复制
#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实现同样的程序,但没有成功。

代码语言:javascript
复制
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)
}

但是我收到了这个错误。

代码语言:javascript
复制
The method display is not applicable for the arguments(double).

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

如果你有另一个强制的例子展示了缩小范围,我将非常感谢你与我分享它:)

致以问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-19 01:30:32

Java不允许缩小强制范围,只允许扩大强制范围。

因此,允许:

代码语言:javascript
复制
float foo(float f) { return f*f; }

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

但当你将要失去精确度的时候就不会了。

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

代码语言:javascript
复制
int d = Integer.MAX_VALUE;
float f = d;
System.out.println(String.format("%d != %12.0f", d, f));

您将拥有:

代码语言:javascript
复制
2147483647 != 2147483648

所以答案比表面上看起来要模糊一点。

票数 2
EN

Stack Overflow用户

发布于 2012-04-19 01:26:36

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

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

另一方面,编写不能被知道自己在做什么的人取消选择的Java代码真的、真的很难。

票数 3
EN

Stack Overflow用户

发布于 2012-04-19 01:26:27

简而言之,Java不允许隐式缩小转换。因此,即使是下面的代码也无法编译:

代码语言:javascript
复制
double d = 12.6;
float f = d;

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

Java Language Specification

赋值转换

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

工作分配上下文允许使用以下选项之一:

  • 身份转换
  • 加宽基元转换
  • 加宽引用转换
  • 装箱转换(可选)后跟加宽引用取消装箱转换(可选),后跟加宽基元转换(可选)。

在这一章的其他地方:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10214521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档