我已将此界面编写为框架的一部分。
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 中?
最佳答案
在 Scala 中,你可以使用 higher-kinded types如果您想以这种方式对 C
和 T
进行参数化:
// 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 的解决方案可能已经足够好了,即使它们的类型安全性较低也是如此。
关于java - 嵌套泛型类型中的泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379630/