我正在尝试基于指定的泛型类型转换和/或生成变量.我知道swift中没有类型擦除,但它似乎不是泛型保留类型,而不是通用的指定条件,例如符合基类.似乎所有我可以投射或初始化的是基类.更奇怪的是,当我在调试器中时,泛型似乎有一个RawPointer到正确的类,甚至变量看起来像他们是正确的类型:
编辑:
从Xcode 6.1开始,这仍然是个问题(简化代码由Gregory Higley提供):
class BaseClass {
func printme() -> Void {
println("I am BaseClass")
}
}
class DerivedClass : BaseClass {
override func printme() -> Void {
println("I am DerivedClass")
}
}
class Util<T: BaseClass> {
func doSomething() {
var instance = T()
instance.printme()
}
}
var util = Util<DerivedClass>()
util.doSomething()
Run Code Online (Sandbox Code Playgroud)
仍打印出"我是BaseClass"
还要注意基类中所需的init {}不再有效.

我理解Some/None/Option背后的整个原理和概念,我当然可以理解它的优点.我的问题更多是最佳做法.什么时候变得矫枉过正,什么时候有意义地使用它.我认为(我可能是错的)但是尽可能多地使用它是有道理的,因为它是一种更安全的方式来传递任何东西(而不是null).我看到自己做了很多事情,虽然有一些功能乱七八糟的地图,getOrElse,get,match甚至有时嵌套它们往往看起来很难看.是否有一些我缺少的概念或一些最佳实践与接收多个Optional值的函数有关.例如:
def updateJobs(id: Int) = withAuth {
request => {
User.userWithToken(request.headers.get("token").get).map {
user =>
Job.jobsAfterIdForForeman(id.toString, user.id.toString) match {
case Some(json) => Ok(json)
case _ => NoContent
}
}.getOrElse(BadRequest)
}
}
Run Code Online (Sandbox Code Playgroud)
甚至更糟的例如:
def addPurchaseRequest(json: JsValue) = {
(json \ "jobId").asOpt[Long].map {
jobId => JobDAO.jobWithId(jobId).map {
job => PurchaseRequestDAO.insert(new PurchaseRequest(json, job)).map {
model =>
val request = model.asInstanceOf[PurchaseRequest]
(json \ "items").asOpt[List[JsObject]].map {
list => {
if (PurchaseItemAssociationDAO.bulkInsert(PurchaseItemAssociation.itemsFromJsonArray(list, request.id))) Option(request.addResponseJson) else None
}
}.getOrElse(None)
}.getOrElse(None)
}.getOrElse(None)
}.getOrElse(None)
}
Run Code Online (Sandbox Code Playgroud)
我设法重构一些看起来不那么疯狂,但有没有更好的方法来重构这个看起来不那么疯狂?我错过了什么或你是否习惯了这样的事情?似乎应该有一个更清洁的做法.
如何获取实现类的类型或类符号。这总是会给我类模型。我什至尝试使用泛型,但是编译器不喜欢 typeOf[T] 并且无论如何它都很丑陋。非常感谢任何帮助。
import scala.reflect.runtime.universe._
abstract class Model {
def className = typeOf[this.type].typeSymbol.asClass
}
Run Code Online (Sandbox Code Playgroud) 哪个在实践中更好?有可选列表或列表中有可选项吗?
目前我正在关注一个可选列表.
列出[选项[T]]或选项[列表[T]]?
编辑:
我遇到的问题是我有crud操作,我正在返回可选类型.我有一种情况,我有一个方法,只进行一次查找,我想利用它来创建一个返回列表的函数.我仍然在用scala弄湿我的脚,所以我很好奇最佳做法是什么.
例:
def findOne(id: Int): Option[T]
Run Code Online (Sandbox Code Playgroud)
无论实现我想用它来做这样的事情,但哪个更好?它们似乎都很奇怪.也许我总是缺少一些东西:
def find(ids: List[Int]) : Option[List[T]]
Run Code Online (Sandbox Code Playgroud)
VS
def find(ids: List[Int]) : List[Option[T]]
Run Code Online (Sandbox Code Playgroud)