RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 723932
Accepted
rjhdby
rjhdby
Asked:2020-09-27 22:42:17 +0000 UTC2020-09-27 22:42:17 +0000 UTC 2020-09-27 22:42:17 +0000 UTC

Kotlin,默认泛型作为函数参数

  • 772

有一个抽象类

abstract class Select<in T, out R>(val db: Db) {
    abstract val sql: String

    abstract fun prepare(stmt: PreparedStatement, data: T)

    abstract fun parseResult(result: ResultSet): R

    fun get(data: T): R {
        val stmt = db.connection().prepareStatement(sql)
        prepare(stmt, data)
        stmt.execute()
        return parseResult(stmt.resultSet)
    }
}

他有继承人

object SelectUsers : Select<Unit, HashMap<Int, User>>(DbImpl) {
    override val sql = "SELECT usr_id, usr_name FROM users"

    override fun prepare(stmt: PreparedStatement, data: Unit) {
        return
    }

    override fun parseResult(result: ResultSet): HashMap<Int, User> {
         //не важно
    }
}

嗯,挑战

users.putAll(SelectUsers.get(Unit))

实际上,我想get为data: T. 例如这样的事情:

fun get(data: T = Unit): R //на что ругается, что логично

可能吗?如果是这样,怎么办?

generics
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    rjhdby
    2020-09-28T14:23:46Z2020-09-28T14:23:46Z

    因此,我决定不发疯,将经典技术与中间抽象类一起使用。同时,他prepare在那里发布了一个定义。

    abstract class SelectWithoutBind<out R>(db: Db) : Select<Unit, R>(db) {
        fun get(): R = get(Unit)
    
        override fun prepare(stmt: PreparedStatement, data: Unit) {
            return
        }
    }
    
    object SelectUsers : SelectWithoutBind<HashMap<Int, User>>(DbImpl) {
        override val sql = "SELECT usr_id, usr_name FROM users"
    
        override fun parseResult(result: ResultSet): HashMap<Int, User> {
             //не важно
        }
    }
    
    • 3
  2. hotkey
    2020-09-27T23:07:42Z2020-09-27T23:07:42Z

    重要的一点——这个默认值来自哪里?

    你可以尝试强制Select它提供,然后你可以用这样一对函数来表达它:

    abstract protected fun defaultT(): @UnsafeVariance T
    
    fun get() = get(defaultT())
    

    @UnsafeVariance这里是必要的,因为它在( )上是Select逆变的,并且不能在返回类型中以类型安全的方式使用。但是这个函数并不突出,它唯一的用途是类型安全的,因为这两个函数都在同一个对象上调用,这意味着对于返回值的实际类型将始终是预期的子类型。Tin TTdefaultTgetgetdefaultT()T

    因此,SelectUsers您将不得不重新定义函数:

    override fun defaultT() = Unit
    

    UPD:这个选项更好:如果你不想defaultT()在每个子类型中实现Select,那么你可以制作一个单独的接口:

    interface ProvidesDefault<T> {
        fun defaultT(): T
    }
    

    并get()使用默认值,将其作为扩展名发出:

    fun <T, R, A> A.get() where A : ProvidesDefault<T>, A : Select<T, R> =
        get(defaultT())
    

    然后实现Select也将能够实现ProvidesDefault<T>,之后就可以在get()没有参数的情况下调用它们。

    同时不存在方差问题。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5