具有通用返回类型的零方法

用户名

我有以下代码,应该是工厂类。它的apply方法具有用于返回类型限制的通用参数:

sealed trait Account
final case class CheckingAccount() extends Account
final case class SavingsAccount() extends Account

object Account {
    def apply[T <: Account]:T = {
        CheckingAccount()   // CheckingAccount().asInstanceOf[T]
    }
}

但是,如果未明确进行类型转换,则编译器将报告“ Banking.CheckingAccount类型的表达式不符合预期的类型T”。有人知道为什么吗?

安德烈(Andrey Tyukin)

方法签名

def apply[T <: Account]: T 

保证每个 T子类型Account都可以产生一个T

特别是,

Account.apply[Nothing]

应该“返回”的实例Nothing由于没有的实例,因此Nothing,实现此方法的唯一方法是抛出错误/异常。换句话说,方法的签名要求的很少,承诺的也很多,以至于该方法实际上无法实现。


解决方法1

删除类型参数。返回Account


解决方法2

如果要保留通用返回类型,则可能需要尝试这样的操作:

sealed trait Account
final case class CheckingAccount() extends Account
final case class SavingsAccount() extends Account

trait Default[X] {
  def createDefault: X
}

implicit object DefaultCheckingAccount extends Default[CheckingAccount] {
  def createDefault = CheckingAccount()
}

implicit object DefaultSavingsAccount extends Default[SavingsAccount] {
  def createDefault = SavingsAccount()
}

object Account {
    def apply[T <: Account](implicit d: Default[T]): T = d.createDefault
}

Account[SavingsAccount]
Account[CheckingAccount]

它可以编译,但是看起来有些多余(调用Account[SavingsAccount]的目的不仅仅是SavingsAccount()什么?)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有通用返回类型的覆盖方法

具有通用返回类型的覆盖方法,没有警告

如何为同一方法传递不同的对象类型,而不是在Java中编写具有相同功能和返回类型的两个方法

具有通用返回类型的命令模式

具有通用返回类型的函数

为什么原始类型不能具有带有通用返回类型的方法

具有泛型类型的Java 8方法参考

具有不同通用参数的C#通用返回类型

Scala通用:具有下限类型的方法的返回数据类型

如何从具有通用返回类型的方法中返回具体类的实例

具有通用类型的接口和方法

具有通用返回类型的可空引用类型

具有返回列表的方法的通用接口

返回类型的C ++ 11方法模板特化

如何返回具有通用类型的类实例作为具有通用类型的接口?

Spring AOP不适用于具有通用类型返回值的方法

具有多个继承类的通用返回类型的自引用方法

具有通用类类型约束的通用方法

通用方法的通用返回类型

结果类型协方差-具有返回接口类型和特定类型的方法的通用类

如何引用具有多个界限的通用返回类型

具有Springs ResponseEntity的Kotlin和通用返回类型

具有不同返回类型的通用数据服务

返回具有其通用类型的Class实例

返回具有通用类型的接口时出错

当具有有界类型参数的类的方法返回其自身类型的值时,如何让返回值保持通用(不进行强制转换)?

具有多种返回类型的接口方法

具有返回类型的Java继承方法

具有多种返回类型的方法