【发布时间】:2021-05-02 02:29:49
【问题描述】:
我希望能够在外部嵌套泛型类的函数中传递相同类型的参数,但也有一个多态的内部泛型类 - 允许我使用 InnerShell 的抽象基类/特征和OuterShell 两者兼而有之。这在 Scala 中是否可行?
class OuterShellClass[Generic] {
def doSomething(param : OuterShellClass[Generic]) : OuterShellClass[Generic] = this;
}
abstract class InnerShellClass[Type] {
}
class InnerShellSubclass[Type] extends InnerShellClass[Type]{
}
class wrapper{
val obj : OuterShellClass[InnerShellClass[String]] = new OuterShellClass[InnerShellSubclass[String]];
}
如果 OuterShellClass 是不变量,我会收到错误:
Note: InnerShellSubclass[String] <: InnerShellClass[String], but class OuterShellClass is invariant in type Generic
如果 OuterShellClass 是协变的,我会收到错误:
covariant type Generic occurs in contravariant position in type OuterShellClass[Generic] of value param
更新:
正如我所想,这个快速破解将起作用 - 请告诉我有更好的解决方案。由于 OuterShellClass 函数中的泛型实际上独立于类创建时的泛型定义 - 不一定是同一个类 - 我不能保证在运行时兼容类。将这些特定函数移至全局函数类,以便我可以收回保证并获得解决方案。我真的需要像这样分割我的课程吗?有没有更好的解决方案?
class OuterShellClass[+Generic] {
}
class Helper {
def doSomething[T] (param1: OuterShellClass[T], param2: OuterShellClass[T]) = param1;
}
abstract class InnerShellClass[Type] {
}
class InnerShellSubclass[Type] extends InnerShellClass[Type]{
}
class wrapper{
val obj : OuterShellClass[InnerShellClass[String]] = new OuterShellClass[InnerShellSubclass[String]];
}
【问题讨论】:
-
存在该错误是有充分理由的。如果没有错误并且您可以执行该操作,那么我可以选择
obj并调用doSomething并将InnerShellClass的不同子类传递给它,这将导致运行时错误。 -
我认为最好打开一个新问题(或编辑此问题),它更专注于您要解决的元问题。
标签: scala generics covariance contravariance