2017-04-05 7 views
0

このメソッドを実装することは可能ですか?実数型を含むセットを複製する

public <T> Set<T> cloneSet(Set<T> original); 

結果セット原稿がTreeSetのであれば、その後、結果セットもTreeSetのある、元のセット(例えば同じ型でなければならない。

+0

おそらく 'セットにclone'を呼びますか? – john16384

+0

標準のJavaライブラリの実装に自分自身を限定すれば、それらはすべて 'clone'メソッドを持っていると思います。 –

+0

@ john16384これは私が最初に考えたものですが、SetはCloneableではありません – aurya

答えて

0

このためにリフレクションを使用することができ。この例を参照してください:

public class CloneTest { 

    public static <T> Set<T> clone(Set<T> set) { 
     try { 
      Set<T> cloned = set.getClass().newInstance(); 
      cloned.addAll(set); 
      return cloned; 
     } catch (InstantiationException | IllegalAccessException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     Set<String> test = new TreeSet<>(); 
     test.add("asd"); 
     printClone(clone(test)); 
     printClone(clone(new HashSet<>(test))); 
    } 

    public static void printClone(Set<?> set) { 
     System.out.println(set.getClass().getSimpleName()); 
     set.forEach(System.out::println); 
    } 

} 

これが印刷されます:

TreeSet 
asd 
HashSet 
asd 

クラス情報を使用して新しいインスタンスを作成します。それがセットであることがわかっているとすれば、addAllを呼び出してすべての要素を追加することができます。要素は複製されないので、同じ参照です。

これは、セットにデフォルトコンストラクタがあるために機能します。私はあなたが空でないコンストラクタを持っていれば、newInstanceメソッドはおそらく失敗すると思います。

これは楽しい小さな例だったが、私は生産であることを使用することはありません:)

アルトゥル

+0

今のところそれは最高のソリューションです、ありがとう:) – aurya

関連する問題