2016-04-17 4 views
0

私は最近、言語を掘り下げることに決めました(私は長い間C++で独占的に作業していましたが、私の視野を少し広げることにしました)。 baClsがで保持する何Javaの基礎とジェネリックスとリフレクションについて

Class baCls = BankAccount.class; 

Class<BankAccount> baCls = BankAccount.class; 

私は銀行口座のというクラスを持っていると私は作成して、私のメイン内のオブジェクトを試みると仮定すると、違いは何ですかそれぞれのケースとコンパイラの出力は何ですか?両方の場合において

答えて

4

baClsBankAccount

クラスへの参照であるジェネリックは、コンパイル時にチェックされますが、実行時に影響を与えません。

IDEでjavap -c -pまたはバイトコードビューアを使用すると、生成されるバイトコードが表示されます。

+0

ああ、ご理解いただきありがとうございます。 それに加えて、違いはなく、プログラムの両方のケースで同じ方法でbaClsを使用できますが、それは正しいですか? – Cooli

+1

@Cooli C++からの主な手口は、Javaにはプリミティブと参照のみがあることです。それ以外の型はありません( 'void'を除く)。これは、あなたに参照を示す特別なシンボルがない理由です。 –

+0

ピーターありがとう。私は、C++のコンセプトからちょっと離れたところまで少し時間がかかります。 – Cooli

0

Peter Lawreyの答えはあなたの特定の質問に対処していますが、2番目のケースでは、コンパイラにとって重要な情報が追加されるという重要な事実は見当たりません。

差は、最初のケースであることである生タイプ

Class baCls = BankAccount.class; 
    ^Missing type parameters. 

ある(少なくとも)(生タイプを使用しての一般的な帰結である)この2つの結果:

  1. Class.nextInstance()メソッドのようなプロデューサメソッドを呼び出して、キャストなしでタイプBankAccountの参照に結果を割り当てることはできません。

    Class baCls = BankAccount.class; 
    BankAccount instance = (BankAccount) baCls.newInstance(/* required args */); 
    

    nextInstance方法はBankAccountのインスタンスを返すことが知られているのでしかし、あなたは、後者の場合には、キャストを必要としません:

    Class<BankAccount> baClsSafe = BankAccount.class; 
    BankAccount instance = baCls.newInstance(/* req args */); 
    
  2. あなたがいる場合は、型の安全性を失いますこれらをコレクションに入れる。例えば:

    Class baCls = BankAccount.class; 
    List<Class<String>> list = new ArrayList<>(); 
    list.add(baCls); // Compiles fine. 
    

    これは細かい表示されていますが、リストの要素が正しい型であることを前提としていた場合、あなたは後で実行時例外を取得:

    for (Class<String> clazz : list) { 
        String instance = clazz.newInstance(); // ClassCastException. 
    } 
    

    instanceは、実際のインスタンスであるため、 BankAccount(ゼロ引数のコンストラクタがあると仮定します)。第2のケースで

    、あなたは最初の場所でリストにこの項目を追加することはできないだろう:

    Class<BankAccount> baCls = BankAccount.class; 
    List<Class<String>> list = new ArrayList<>(); 
    list.add(baCls); // Compiler error. 
    

私は、例えば、あなたが生の種類について、最大読みになることをお勧めしますgenerics tutorialEffective Java 2nd Edアイテム23「新しいコードで未加工の型を使用しない」。

関連する問題