6

boolean が含まれる理由 (Collection < ?> c); コレクションフレームワークのメソッドはすべてのタイプに許可されていますか? .But boolean addAll(Collection< ?extends E> c); 許可しますか?E を拡張します。だから、私は明確にするためにプログラムを書きました。これが私のプログラムです

public class ContainAllTest {
    // take ServiceDto 
    ArrayList<ServiceDto> resultList = new ArrayList<ServiceDto>();

    void Test() {

        ServiceDto serviceDto = new ServiceDto();
        serviceDto.setName("test");
        resultList.add(serviceDto);
        // another arraylist that takes String 
        ArrayList<String> resultList1 = new ArrayList<String>();
        resultList1.add("test");
        // no error, goes for run time.Contain all checking is done for two generic type ServiceDto and String:
        resultList.containsAll(resultList1);
        // error shown at compile time,as addAll take ServiceDto as generic type but the generic type for resultList1 take String:
        resultList.addAll(resultList1);    
    }

だから、私の質問は、resultList.containsAll(resultList1); をいつ利用できるかということです。ジェネリック型が異なる場合.私の場合はStringとServiceDto.booleanのcontainsAll(Collection< ? > c)booleanのcontainsAll(Collection< ?extends E> c)に置き換えると何か問題がありましたか ?

4

3 に答える 3

3

その理由は、containsAll(and contains, remove, removeAll)Object#equalsが比較に使用されているためだと思います。

おそらく、関係のないクラスのオブジェクトを返すことができるオーバーライドObject#equalsされたメソッドを持つことができます。それは良いアイデアではありませんが、有効な実装になる可能性があります。Etrue

于 2013-08-15T07:56:10.313 に答える