嵌套泛型类型中的泛型类型参数

时间:2012-11-14 13:21:21

标签: java scala collections interface

我已将此界面编写为框架的一部分。

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

2 个答案:

答案 0 :(得分:4)

在Scala中,如果您想以这种方式对CT进行参数化,则可以使用higher-kinded types

// 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的解决方案可能已经足够好,即使它们的类型安全性较低。

答案 1 :(得分:3)

在每个方法调用的基础上,您可以尝试类似:

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