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

标签 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 中?

最佳答案

在 Scala 中,你可以使用 higher-kinded types如果您想以这种方式对 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 的解决方案可能已经足够好了,即使它们的类型安全性较低也是如此。

关于java - 嵌套泛型类型中的泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379630/

相关文章:

java - Button2 正在做 Button1 应该做的事情

java - Spring MVC - 没有绑定(bind)到线程的 Hibernate session

java - 在android中使用系统时间函数获取时间戳?

scala - 无法解析具有此类签名的引用 StructField

java - Collections.rotate() 作为 Java 中数组列表的副本

c# - 用 IEnumerable<> 源填充 Dictionary<>

java - jackson XML : nested field deserialization

java - 如何使用反射从scala调用spark UDF?

java - 如何在 JPA 中映射自定义集合?

java - 为什么类型删除概念被如此广泛地使用?