2016-09-09 17 views

答えて

6

その他unaryMinusunaryPlusの基本的な意味を定義して、そして実際に数値型に、彼らは実際にも、関数として呼び出すことがないかもしれません。

ILOAD 1 
ISTORE 2 

、コードを-xまたはx.unaryMinus()が同じバイトコード生成:例えば、+x又はx.unaryPlus()コーディングする(xInt型である)、同じバイトコードを生成

ILOAD 1 
INEG 
ISTORE 2 

をしかし、より行くありますその上で...

なぜコンパイラは+x+xx.unaryPlus()は何もしないと言う人もいますし、-xx.unaryMinus()は符号を逆転させるだけです。それは正しくありません。 Javaでは、拡大と展開解除が含まれる可能性があるため、より複雑です(Unary Numeric Promotionを参照)。これらの演算子の完全な結果を説明します。これは、ボックス化された値とタイプがIntより小さい場合に影響します。 ShortおよびByteの値の場合、これらの演算子は、タイプがIntに広げられた新しいボックス化されていない値を返します。そして、両方の演算子がこのより隠された機能を持つので、+xが何もしないと思っても、両方ともバイトコードを生成する必要があります。ちなみに、これはC言語と同様で、Usual Arithmetic Conversionsと呼ばれています。

したがって、このコードは無効です:基本数値型にこれらの数値例で

val x: Short = 1 
val y1: Short = +x    // incompatible types 
val y2: Short = x.unaryPlus() // incompatible types 
val z1: Short = -x    // incompatible types 
val z2: Short = x.unaryMinus() // incompatible types 

彼らはこれらの演算子のアイデアは、あなたがしたい場合がありますオペレータ機能と同一視することを可能にするために魔法をコンパイラしています他のクラスでは過負荷になります。

な演算子のオーバーロードなど、他の用途のために

...

しかし、彼らはただ、数学的使用よりもそこにあり、オペレーターとして、任意のクラスで使用することができます。 Kotlinは演算子を関数として公開し、unaryMinusunaryPlusを含む特定の演算子のセットにoperator overloadingを適用できます。

これらを使用して、自分自身または既存のクラスの演算子を定義することができます。たとえば、私はThingsは、オプションの有限集合の内容を否定するunaryMinus()オペレータと一緒に列挙クラスですSet<Things>あります

enum class Things { 
    ONE, TWO, THREE, FOUR, FIVE 
} 

operator fun Set<Things>.unaryMinus() = Things.values().toSet().minus(this) 

をそして私は、私はいつでも私のenumセットを否定することができます

val current = setOf(Things.THREE, Things.FIVE) 
println(-current)  // [ONE, TWO, FOUR] 
println(-(-current)) // [THREE, FIVE] 

修飾子operatorで拡張機能を宣言しなければならないことに注意してください。これは機能しません。コンパイラは、演算子を使用しようとするときにこれを忘れた場合に通知します。

Error:(y, x) Kotlin: 'operator' modifier is required on 'unaryMinus' in 'com.my.favorite.package.SomeClass'

+0

本当に完全な答えです。ありがとう! – Jire

3

これらの演算子の目的は、書くことができるようにすることです:

val a = System.nanoTime() 
val b = -a // a.unaryMinus() 
val c = +b // b.unaryPlus() 

彼らは一緒に使用することができますが++/inc--/dec事業者に直接関係はありません。次の式は異なっている

お知らせ:

--a // a = a.dec() 
-(-a) // a.unaryMinus().unaryMinus() 
6

これらの演算子は、整数の兆候です。

+5コール5.unaryPlus()とリターン5

-5コール5.unaryMinus()と戻る-5:ここではいくつかの例です。

-(-5)通話5.unaryMinus().unaryMinus()とリターン5

+0

多くの意味があります。 – Jire

関連する問題