2017-01-28 3 views
-3

Anstatt einer impliziten Konvertierung kann der Java-Compiler einen Fehler erzwingen, wenn die Variablentypen nicht übereinstimmen. Zum Beispiel:Wie wird der Java-Compiler dazu gebracht, eine explizite Typkonvertierung zu erzwingen?

int intValue=3; 
double dblValue = 2.2; 
double result; 
result = 1/intValue*(intValue-dblValue); 

In dem obigen Beispiel Java implizit konvertieren (1/intValue) auf eine ganze Zahl mit dem Wert 0

Was will ich für den Compiler ist ein Fehler, wenn Variablentypen don ausstellen nicht übereinstimmen, sondern implizit konvertieren.

Vielen Dank im Voraus

Edit1: Die obige Gleichung ist nur ein Beispiel. Ich weiß, wie dieses Problem zu beheben, indem Sie eine der folgenden Lösungen:

result = 1.0/intValue*(intValue-dblValue); 

oder

result = 1/(double)intValue*((double)intValue-dblValue); 

, aber das ist nicht das, was ich bin nach. Danke

Edit2: Ich bezog sich auf Typkonvertierung nicht Typ Casting. Ich suche nach dem Compiler, um explizite Typkonvertierungen zu erzwingen.

Ich bin auf der Suche nach so etwas wie folgt aus: https://support.microsoft.com/en-us/help/311329/option-explicit-and-option-strict-in-visual-basic-.net-and-in-visual-basic

+1

Nun, das ist absolut legaler Java-Code, also gibt es keinen Grund, dass es in diesem Fall einen Fehler erzeugt. –

+5

"implizit Cast (1/intValue) zu einer Ganzzahl mit dem Wert 0" - was? Dort ist kein Casting involviert. Es erzeugt kein Double und wirft es dann auf int oder ähnliches. Der Divisionsoperator erzeugt direkt einen Int. – user2357112

+0

Nein. Die Regeln von Java sind bereits definiert, und das von Ihnen erwähnte Konstrukt ist kein Fehler. Es ist nicht einmal eine Typumsetzung. Es ist eine implizite Umwandlung in den Fällen, in denen Ints und Doubles enthalten sind, und nichts in dem Fall, bei dem nur Ints beteiligt sind. Unklar, was du verlangst. – EJP

Antwort

1

Wie wäre es, anstelle von zwei ganzen Zahlen Dividieren Sie eine doppelte und eine ganze Zahl teilen?

result = 1.0/intValue*(intValue-dblValue); 
+0

Ja, ich weiß das, aber das ist nicht das, was ich frage – CPSProgrammer

+0

Aber es ist die Antwort auf das, was Sie fragen. –

0

„Anstatt implizite Schublade gesteckt, gibt es eine Möglichkeit, die Java-Compiler zu erzwingen einen Fehler ausgibt, wenn Variablentypen nicht übereinstimmen.“ Es wird ein Fehler ausgegeben, wenn die Typen nicht übereinstimmen oder Informationen verloren gehen. Wie bereits in einem Kommentar erwähnt, gibt es in Ihrem Beispiel keine "Typumwandlung" oder eine einschränkende Umwandlung. Der Compiler macht genau das, was er soll, und nein, das kannst du nicht ändern.

"Was ich will, ist für den Compiler zu ..." Leider, was Sie wollen, wird vom Compiler nicht berücksichtigt. Es wird nur das tun, was für die Übereinstimmung mit der Java-Sprache durch die Java-Sprachspezifikation und Kompatibilitätsanforderungen spezifiziert ist.

In Ihrem Fall angegeben Sie einen vollkommen legal int Betrieb erfordert weder eine Erweiterung noch schmäler Umwandlung, so dass selbst wenn die Compiler kümmern sich um tun, was Sie wollen, würde es nichts für sie, darüber zu beschweren.

Sie können Lint-Tools wie Findbugs und CheckStyle verwenden, um Ihre Quelle für alle Arten von Fehlerrisiken, sogar für benutzerdefinierte Regeln, vorzuverarbeiten. Sie könnten den Anwendungsfall eines Programmierers erkennen, der versehentlich Assoziativität oder Typrisiken in gemischten Ausdrücken ignoriert. Sie sind ausgezeichnete Werkzeuge; Schau sie dir an.

+0

@ GrzegorzGórkiewicz Ich habe den Beitrag nach dem Kommentieren aktualisiert – CPSProgrammer

Verwandte Themen