互換性のない型:intはbooleanに変換できません
私は、Cがそれを許可し、javaが許可しない理由に興味があります。したがって、私は言語の型システム、特にその強さに興味があります。
質問には2つの部分があります。
Javaが変換さint
れないのはなぜboolean
ですか?
これは、可能な限り明示的にすることを意図したJavaに要約されます。それは非常に静的であり、その型システムによって非常に「あなたの顔に」なります。他の言語で自動的に型キャストされるものは、Javaではそうではありません。書かなければならないint a=(int)0.5
があります。に変換float
するint
と情報が失われます。int
への変換と同じboolean
エラーが発生しやすくなります。また、多くの組み合わせを指定する必要がありました。確かに、これらのことは明らかであるように見えますが、それらは注意を怠るつもりでした。
ああ、そして他の言語と比較して、Javaは非常に仕様正確でした。バイトコードは単なる内部実装の詳細ではなかったからです。彼らは、すべての相互作用を正確に指定する必要があります。巨大な仕事。
どして if
他のタイプを受け入れないのboolean
ですか?
if
以外のタイプを許可するように完全に定義できましたboolean
。次のことを同等と定義することができます。
true
int != 0
String
と .length>0
- 非
null
(およびBoolean
with値ではない)他のオブジェクト参照false
。
- または:以外であり、
null
そのメソッドObject.check_if
(この機会に私が発明した)が返す他のオブジェクト参照も返しますtrue
。
彼らはしませんでした。本当の必要はありませんでしたし、彼らはそれをできるだけ堅牢で、静的で、透明で、読みやすいものにすることを望んでいました。暗黙的な機能はありません。また、実装はかなり複雑で、すべての可能なケースで各値をテストする必要があると確信しているため、パフォーマンスも小さな要因を果たしているだけかもしれません最初のリリースではJITコンパイラはありませんでした。少なくとも私が使用していたコンピューターではそうではありませんでした)。
より深い理由
より深い理由は、Javaにプリミティブ型があるため、オブジェクトとプリミティブの間で型システムが引き裂かれていることです。たぶん、もし彼らがそれらを避けていたら、事態は別の方法に変わっていただろう。前のセクションで示したルールでは、すべてのプリミティブの真実性を明示的に定義する必要があります(プリミティブはスーパークラスを共有せず、プリミティブには明確に定義さnull
れていないため)。これはすぐに悪夢に変わります。
見通し
まあ、そして最終的に、多分それは言語設計者の好みにすぎないかもしれません。各言語はそこで独自の方法でスピンするようです...
たとえば、Rubyにはプリミティブ型がありません。すべて、文字通りすべてがオブジェクトです。すべてのオブジェクトに特定のメソッドがあることを確認するのは非常に簡単です。
Rubyは、投げることができるすべての種類のオブジェクトの真実性を探します。興味深いことに、それはまだ何もありませんboolean
(それはプリミティブを持っていないため)タイプを、そしてそれには持っていないBoolean
のいずれかのクラスを。値true
がどのクラスであるか(を使用するtrue.class
と便利です)を尋ねると、が得られTrueClass
ます。そのクラスには実際にメソッド、つまりブール値(| & ^ ==
)の4つの演算子があります。ここでは、if
それはどちらかである場合にのみ、その値のfalseyを考慮しfalse
たりnil
(null
ルビーの)。それ以外はすべて真実です。だから、0
または""
両方が真実です。
Object#truthy?
任意のクラスに実装できるメソッドを作成し、個々の真実性を返すのは簡単なことでした。たとえば、String#truthy?
空でない文字列、またはその他の場合に当てはまるように実装できます。Rubyはほとんどの部門でJavaのアンチテーゼであるにもかかわらず、そうではありませんでした(mixinを使用した動的なダックタイピング、クラスの再オープンなど)。
これは$value <> 0 || length($value)>0 || defined($value)
、真実であることに慣れているPerlプログラマにとっては驚くかもしれません。等々。
SQLを入力します。その規則でnull
は、式の内部で何があっても自動的にfalseになります。だから(null==null) = false
。Rubyで、(nil==nil) = true
。幸せな時間。