我在学习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中正确地做到这一点?
我已经看到几个关于openOptionsMenu()无法在各种Android版本上运行的问题的报告,例如:
但我遇到的问题似乎与正在使用的appcompat-v7支持库的版本有关.
实质上,对于较新版本的appcompat-v7,如果您的活动扩展了Activity,则在调用openOptionsMenu()时菜单将显示正常,但如果您扩展ActionBarActivity或AppCompatActivity(即使用兼容性库)则不会起作用.在较旧版本的appcompat-v7中,它可以正常工作.
它是可重复的,如下:
经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本.
这种行为在模拟器和物理设备上是相同的,在Android版本5.1.1(23)和2.1(7)上是我测试过的两个版本.
我添加了对此错误的评论:Android问题跟踪器错误
任何建议,想法或变通方法表示赞赏!
史蒂夫
java android options-menu android-optionsmenu android-support-library
经过多年的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)
我已经使用字符串键将任务放在散列映射中,因此它可以快速,直接地访问映射中的任何任务.每个任务都包含密钥,因此我知道当我将各个任务传递给其他函数时,关键是什么.
更新我正在使用的持续时间,map并update-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) android ×1
clojure ×1
constructor ×1
dictionary ×1
java ×1
kotlin ×1
options-menu ×1
update-in ×1