小编Ste*_*ley的帖子

在Kotlin中,如何扩展具有多个构造函数的类?

我在学习Kotlin的过程中,遇到了一个我无法弄清楚的问题.我想在Kotlin中扩展Java类RuntimeException,并且能够在不同的情况下使用它的三个构造函数中的任何一个(基于我想要抛出异常时的信息).在java中,我的类看起来像这样:

public class PhotoLibException extends RuntimeException {

    public PhotoLibException(String message, RuntimeException ex) {
        super(message, ex);
    }

    public PhotoLibException(String message) {
        super(message);
    }

    public PhotoLibException(RuntimeException ex) {
        super(ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在Kotlin中执行此操作时,我使用此答案作为指导:然而,Kotlin辅助构造函数,我在尝试弄清楚如何正确调用适当的超级构造函数时遇到了问题.例如,使用函数似乎是一个很好的方法,如下所示:

fun PhotoLibException(message: String): PhotoLibException {
    val ex = null
    return PhotoLibException(message, ex)
}

fun PhotoLibException(ex: Exception): PhotoLibException {
    val message = ""
    return PhotoLibException(message, ex)
}

class PhotoLibException(message: String, ex: Exception?): RuntimeException(message, ex) {
}
Run Code Online (Sandbox Code Playgroud)

但是,在上面的Kotlin示例中,我总是使用两个args调用超级构造函数,而不是调用最适合该情况的构造函数.所以我上面的工作,但不完全是在Java中做的事情,在每种情况下调用不同的构造函数.我还尝试在上面的每个乐趣中实例化一个新的RuntimeException,并将其转换为PhotoLibException,但我不允许这样做.

任何人都可以建议我如何在Kotlin中正确地做到这一点?

constructor kotlin

54
推荐指数
2
解决办法
3万
查看次数

openOptionsMenu()在appcompat-v7 22.1.0或更新版本中不起作用

我已经看到几个关于openOptionsMenu()无法在各种Android版本上运行的问题的报告,例如:

跨Android版本的openOptionsMenu()

openOptionsMenu()不起作用

但我遇到的问题似乎与正在使用的appcompat-v7支持库的版本有关.

实质上,对于较新版本的appcompat-v7,如果您的活动扩展了Activity,则在调用openOptionsMenu()时菜单将显示正常,但如果您扩展ActionBarActivityAppCompatActivity(即使用兼容性库)则不会起作用.在较旧版本的appcompat-v7中,它可以正常工作.

它是可重复的,如下:

  1. 在Android Studio中,导入示例'ActionBarCompat-Basic'
  2. 在屏幕上添加一个按钮,调用openOptionsMenu()
  3. 请注意,这样可以正常工作,因为样本中使用了旧版本的库appcompat-v7:21.0.3
  4. 更改依赖关系以使用appcompat-v7:23.0.1,重建,单击按钮时菜单将不会出现.
  5. 更改主要活动以扩展活动(即没有应用程序兼容性) - 它的工作原理
  6. 更改主要活动以扩展AppCompatActivity(即使用应用程序兼容性libarry) - 它失败

经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本.

这种行为在模拟器和物理设备上是相同的,在Android版本5.1.1(23)和2.1(7)上是我测试过的两个版本.

我添加了对此错误的评论:Android问题跟踪器错误

任何建议,想法或变通方法表示赞赏!

史蒂夫

java android options-menu android-optionsmenu android-support-library

11
推荐指数
1
解决办法
1452
查看次数

在Clojure中,如何正确更新嵌套映射?

经过多年的Java(和PHP/JavaScript)经验,我刚刚开始学习Clojure.真是个挑战:-)

如何以惯用方式更新值的映射?当我map在地图上使用该函数时,它不返回地图,它返回一个序列.

我正在开发一个小应用程序,我有一个任务列表.我想做的是改变一些单独任务中的一些值,然后更新原始任务列表.以下是我正在测试的任务:

(defrecord Task [key name duration])

(def tasks
  (atom
    {
     "t1" (->Task "t1" "Task 1" 10)
     "t2" (->Task "t2" "Task 2" 20)
     "t3" (->Task "t3" "Task 3" 30)
     }
    ))
Run Code Online (Sandbox Code Playgroud)

我已经使用字符串键将任务放在散列映射中,因此它可以快速,直接地访问映射中的任何任务.每个任务都包含密钥,因此我知道当我将各个任务传递给其他函数时,关键是什么.

更新我正在使用的持续时间,mapupdate-in迭代并有选择地更新每个任务的持续时间,并返回修改后的任务.

这是功能:

(defn update-task-durations
  "Update the duration of each task and return the updated tasks"
  [tasks]
  ; 1) Why do I have to convert the result of the map function,
  ;    from a sequence then back to a map?
  (into {} …
Run Code Online (Sandbox Code Playgroud)

dictionary clojure update-in

5
推荐指数
1
解决办法
638
查看次数