0

javaはオブジェクト指向言語であるため、ポリモーフィズムを示す必要があります。以下は、ポリモーフィズムのタイプの私の定義です。アドホック多相性、およびそのサブタイプ。強制。

アドホック多相性は、関数がいくつかの異なるタイプ(共通の構造を示さない場合があります)で機能するか、機能しているように見える場合に取得され、タイプごとに無関係に動作する可能性があります。アドホック多相には、強制と過負荷の2つのタイプがあります。

強制は、型エラーを回避するセマンティック操作です。コンパイラーは、関数呼び出しの引数型を関数定義のパラメーター型に一致させるために、ある型を別の型に変換します。関数定義は1つのタイプでのみ機能します。コンパイラは、コンパイル時に強制を実装します。

この例は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言語仕様から:

割り当ての変換

代入変換は、式の値が変数に代入されるときに発生します。式の型を変数の型に変換する必要があります。

割り当てコンテキストでは、次のいずれかを使用できます。

  • ID 変換

  • 拡張プリミティブ変換

  • 拡張参照変換

  • 必要に応じて拡大参照変換が続くボックス化変換

  • 必要に応じて、ボックス化解除の変換に続いて、拡張プリミティブ変換。

およびその章の他の場所:

メソッド呼び出し変換 ... 代入変換と同じ変換を実行します。

「プリミティブ変換の縮小」がそのリストにないことに気付くでしょう。

于 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 の float は標準の 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 に答える