4

このインターフェースは、フレームワークの一部として作成しました。

public interface CollectionFactory {

    public <T> Collection<T> newCollection();
}

しかし、実装者がコレクションの返される型を定義できるようにして、次のようにキャストする必要がないようにしたい:

public interface CollectionFactory<C extends Collection> {
    public C newCollection();
}

問題は、T で型安全性が失われることです。

public interface CollectionFactory<C extends Collection> {
     public <T> C<T> newCollection();
}

そして、次のように T を事前に指定したくありません。

public interface CollectionFactory<T, C extends Collection<T>> {
    public C newCollection();
}

私の知る限り、これは不可能です。
誰かが私を驚かせたいですか?

また、前菜として、これに似たものがたとえば… Scalaで可能かどうか知っている人はいますか?

4

2 に答える 2

4

Scala では、両方を次のようにパラメータ化する場合は、高カインド型を使用できます。CT

// means that C has a single type parameter and C[T] extends Seq[T] whatever T is
// or C[_] <: Seq[_] which means C[T] must extend Seq[Something] but not necessarily Seq[T]
trait SeqFactory[C[T] <: Seq[T]] { 
  def newSeq[T]: C[T]
}

実装例:

object ListFactory extends SeqFactory[List] { 
  def newSeq[T] = List() 
}

これは Java では実行できないことは正しいですが、目的によっては、@Dylan または @CostiCiudatu のソリューションは、型安全性が低くても十分である場合があります。

于 2012-11-14T13:44:49.240 に答える
3

メソッド呼び出しごとに、次のようなことを試すことができます。

public interface CollectionFactory {
    public <T, C extends Collection<T>> C newCollection();
}
于 2012-11-14T13:40:36.023 に答える