2016-11-24 8 views
1

最初の質問には、フォーマットミスを理解してください。JavaでIntegersで任意のコレクションを塗りつぶす

Javaでは、ストリームを使用して、それがIntstreamを使用して整数といくつかのコレクションを移入することが可能です、あなたは一例ArrayListためにHashSetを交換したり、場合LinkedListあなたは、単に代わりにその指定されたコレクションを返します

IntStream.range(from,to).boxed().collect(Collectors.toCollection(HashSet::new)); 

これを使用して、目的のコレクションインターフェイスを設定する方法を設定できますか?

クラス(java.lang.ClassLoaderの)のjava.lang.Class「内のプライベートアクセス権を持っている」:私は警告を取得し、これをしようと

public returnType fillWithInt(Class<?> t, int from, int to){ 
    return IntStream.range(from,to) 
     .boxed() 
     .collect(Collectors.toCollection(t::new)); 
} 

:私が探しているこのようなものです。

私はこれを一日中行っており、何をすべきか理解できません。

免責事項として私はプログラミングでは非常に新しいので、私はこれを完全に間違って扱っているかもしれません。それが正しい場合、私は正しい方向に振る舞うことを望んでいます!

+3

ヒント:何[ 'toCollection'(http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html# toCollection-java.util.function.Supplier-)はパラメータ型として期待していますか? – Holger

+0

@Holgerありがとう、私はサプライヤーと私の不確実性を認識しました、私は勉強に行きます! –

答えて

2

method referenceは、達成しようとするクラスのインスタンスを使用して定義することはできませんので、CollectionSupplierを実装する必要があります。

public <C extends Collection<Integer>> C fillWithInt(Class<C> t, int from, int to) { 
    return IntStream.range(from,to) 
     .boxed() 
     .collect(
      Collectors.toCollection(
       () -> { 
        try { 
         return t.newInstance(); 
        } catch (InstantiationException | IllegalAccessException e) { 
         throw new IllegalArgumentException(e); 
        } 
       } 
      ) 
     ); 
} 

例:

Set<Integer> set = fillWithInt(HashSet.class, 1, 10); 

それとも単に次のように、あなたのメソッドのパラメータとしてSupplierを提供することにより:

あなたはとして次のリフレクションを使用してそれを行うことができます

public <C extends Collection<Integer>> C fillWithInt(Supplier<C> supplier, int from, int to){ return IntStream.range(from,to) .boxed() .collect(Collectors.toCollection(supplier)); } 

例:

Set<Integer> set = fillWithInt(HashSet::new, 1, 10); 
+1

クラス>を持つことができないので、Reflectionバリアントでは機能しません。 'HashSet.class'は生の' HashSet'型を参照する 'Class '型を持ちます。これは解けるものではないので、Java 8の下ではもう必要ないということは良いことです。 – Holger

関連する問題