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 回答