我已将此界面编写为框架的一部分。
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 ?
答案 0 :(得分:4)
在Scala中,如果您想以这种方式对C
和T
进行参数化,则可以使用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();
}