2016-10-24 3 views
0

このコードを理解するのは苦労します。 Phone13は、SamSungクラスとHTCクラスの親インターフェイスです。 また、VOはSamSungVOとHTCVOの両方の親クラスです。 ここで、myPhone13というインターフェースのSamSungインスタンスを作成します。次に、SamSungVOインスタンスを作成します。私もVOにキャストし、 myPhone.info(myVO)メソッドに入れます。IOC/JDBC/DAO - このコード例はどのように機能しますか?

myPhone.info(VO myVO)はVOをパラメータとしていますが、私はSamSungクラスでmyPhoneインターフェイスを実装していますが、わかりません。だから、私はVOオブジェクトをそのパラメータとしてSamSungオブジェクトを取得するメソッドに入れているようです。私は不思議に思う。このインスタンスはVOからSamSungVOに自動的にどのように移行できますか?

子インスタンスをパラメータとするメソッドの引数として親オブジェクトを置くことはできないと考えました。

package others; 

class VO{} 

interface Phone13 <E extends VO>{ 
    public void info(E myVO); 
} 

class SamSung implements Phone13<SamSungVO>{ 
    @Override 
    public void info(SamSungVO myVO) { 
     System.out.println(myVO.name);  
    } 
} 
class SamSungVO extends VO{ 
    String name = "SamSung"; 
} 


class HTC implements Phone13<HTCVO>{ 

    @Override 
    public void info(HTCVO myVO) { 
     System.out.println(myVO.name);  
    } 

} 
class HTCVO extends VO{ 
    String name = "HTC"; 
} 

public class MyIOC02 { 

    public static void main(String[] args) { 
     Phone13 myPhone = null; 
     // When I need to use SamSung 
     myPhone = new SamSung(); 
     VO myVO = new SamSungVO(); 
     myPhone.info(myVO); 

    } 
} 

答えて

0

myPhone変数は入力されません。コンパイラは

Phone13 myPhone = null 

はラインであなたに警告を与える「Phone13は生タイプです。ジェネリック型Phone13への参照をパラメータ化する必要があります」。

別の警告がラインである:

myPhone.info(myVO) 

「法情報(VO)は、生タイプPhone13に属しているジェネリック型Phone13への参照がパラメータ化されなければなりません。」。

myVOをHTC型でインスタンス化すると、コンパイラは同じ警告を表示しますが、実行時にClassCastExceptionが発生します。

myVO = new HTCVO() 
myPhone.info(myVO) 

あなたはそれぞれの場合にSamSungVOするmyVOをインスタンス化するのでSamSungVO導出の情報()メソッドが呼び出されます。引数が実際に期待される型であれば、プログラムは実行され、それが他の型であれば適合してスローされません。

ジェネリックスは、コンパイラがタイプセーフティを検出するのを支援するテクノロジです。タイプの安全性を判断できない場合は、警告が表示されます。このようなコンパイラの警告には本当に従って解決しなければなりません。それ以外の場合はジェネリックを使用するのは無駄です。

関連する問題