2017-05-04 5 views
-1

Javaの型システムは、配列を共変変数として処理するという点で、壊れたサブタイプの規則に従うことを学びました。私は、メソッドの引数が読み込まれ、変更された場合、タイプセーフな唯一のオプションは不変式であり、Javaの簡単な例を提供できることをオンラインで読んでいます。Javaはオブジェクトの型を動的にチェックします

このルールのJavaのパッチは、パフォーマンス面で目立つように格納されているオブジェクトのタイプを動的にタイプチェックすることでですか?私はそれがオブジェクトのタイプをチェックするための1つまたは2つ以上の追加の命令であるとは想像できません。フォローアップの質問は、実行時のパフォーマンスの違いを無視して、これは配列のサブタイプが壊れていないというルールと同じですか?私の質問が初心者なら私を許してください!

+1

downvoteの場合、私が間違っていることを教えて、少なくとも私を助けてくれますか?あなたがこの質問に問題があるかどうか、これは重複した質問である場合、またはあなたが私よりもグーグルでよりうまくいる場合、 – Poptart

+1

コード質問や特定の質問をしていないので、おそらく投票が中止されました。このように見えるのは、https://softwareengineering.stackexchange.comのディスカッションに適しています。 – tima

答えて

1

パフォーマンスは常に難しい問題です。コンテキストに応じて、そのようなチェックは完全に最適化されるかもしれません。たとえば:

public static void main(String[] args){ 
    Object[] array = new String[2]; 
    array[0] = "Hello, World!";//compiler knows this is safe 
    System.out.println(array[0]); 
    array[1] = new Object();//compiler knows this will throw 
} 

ここで、コンパイラは、両方の割り当て時に、配列の実際の型へのアクセス権を持っているので、実行時のチェックはコンパイラが十分に賢いであれば、それはそれらを最適化することができます(厳密には必要ではありません)。この例では、しかし、実行時のチェックが必要である

:あなたは場所を取ることができ、心曲げジャストインタイムの最適化を検討する際に

public static void main(String[] args){ 
    Object[] array = Math.random()<.5? new String[2]: new Object[2]; 
    array[0] = "Hello, World!";//compiler knows this is safe 
    System.out.println(array[0]); 
    array[1] = new Object();//compiler must check array type 
} 

物事はさらに複雑になります!全体としては、Javaの安全機能の多くと同様に、必要なパフォーマンスコストがあります。目立つかどうかは、ユースケースによって異なります。

同値質問について:いいえ、これは不変配列を持つことと同じではありません。不変の配列は、Object[] array = new String[2];をコンパイル時エラーにします。

0

私はあなたの質問に答えるように思われる記事を見つけた:

「Javaは、実行時にオブジェクトの種類を見つけるために3つの異なる方法を提供:。instanceofキーワード、getClass()java.lang.ClassisInstance()方法を3つのすべてのみgetClass()のうちオブジェクトのタイプがスーパータイプであれば真を返します。

MyObject.getClass()と書くと、オブジェクトクラスが返されるはずです。または、MyObject.isInstance(TheObject)を使用できます。MyObjectTheObjectの場合はtrueを返します。第三に、あなたのことができるようにする必要があります。また、ここで

Java isInstance vs instanceOf operator

if (MyObject instanceof TheObject) { 
//your code 
} 

Hereは、Webページ

へのリンクはまたここに明確に役立つかもしれない別のポストへのリンクです他の同様の質問への2つのリンクです:

How to determine an object's class (in Java)?

java - How do I check if my object is of type of a given class?

+0

ありがとうございました!私はコードを書いていません。私はオブジェクトを挿入するたびに舞台裏で何が起きるのかがより興味があります。オブジェクトを挿入するときにJavaが自動的に 'isInstance()'を呼び出すのですか、それとも自分で行う必要がありますか? – Poptart

+0

私はあなたの質問を残念ながら理解していません。 'isInstance()'はあなたのオブジェクトをチェックできる関数です。なぜそれが自動的に呼び出されるのですか? – JFreeman

+0

実際にあなたはそれを言及していませんが、私はJavaが自動的にあなたのコードとverifysを通してあなたが実際の既存のオブジェクトだけを割り当てたことを読み取ると信じています。例えば、 'int myInt = myString'と' String myString = "hi" 'を書いた場合、それは壊れるでしょう。 – JFreeman

関連する問題