Android项目中的检测测试存在问题:从“项目结构”窗口调用时,它们正在运行,但在编辑器的绿色箭头运行时No tests found 。 我想他们正在运行unit testing。 有趣的是,Java项目没有问题。 如果我在OS Windows或MacOS上运行Instrumented测试 – 一切都是okey,但不是在Ubuntu中。 Kotlin插件版本是1.2.21 。 Gradle版本是3.0.1 。
比方说,我有一个简单的数据类,可以序列化为一个字符串: class Time(val hours: Int, val minutes: Int, val seconds: Int) { fun serialize(): String { return “%02d:%02d:%02d”.format(hours, minutes, seconds) } } 我怎样才能添加第二个构造函数,允许我使用序列化的字符串构造这个对象? 我希望能够使用 constructor(serializedString: String) { val subs = serializedString.split(“:”) return Time(subs[0].toInt(),subs[1].toInt(),subs[2].toInt()) } 但是来发现次要构造函数需要实际覆盖主构造函数。 显然,我的二级构造函数没有forms或forms类似于我的主要构造函数。 这里的正确答案是简单地制作一个包含静态deserialize方法的companion object吗? Kotlin中没有办法让多个构造函数接受不同types的参数吗? 或者是我根本不应该有一个主要的构造函数的问题?
我想用Kotlin使用Realm使用这个Kotlin Realm Extention库。 我已经添加mavenCentral()存储库并compile “com.github.vicpinm:krealmextensions:1.2.0″到app.gradle。 当我运行我的应用程序,我得到了这个错误: java.lang.IllegalArgumentException: Feature is not part of the schema for this Realm. Did you added realm-android plugin in your build.gradle java.lang.IllegalArgumentException: Feature is not part of the schema for this Realm. Did you added realm-android plugin in your build.gradle 我试图在app.gradle中添加apply: realm-android ,但它不工作(旁边我认为它应该从库内部调用)。 我还在我的Activity中添加了Realm.init(baseContext) ,因为查询操作需要它。
class SetContentView( @LayoutRes private val layoutRes: Int) { private var value : T? = null operator fun getValue(thisRef: Activity, property: KProperty): T { value = value ?: DataBindingUtil.setContentView(thisRef, layoutRes) return value } } val binding: ActivityDogBinding by contentView(R.layout.activity_dog) DogActivity.kt fun contentView(@LayoutRes layoutRes: Int): SetContentView { return SetContentView(layoutRes) } 当我尝试打电话给活动 val binding: ActivityLoginBinding by contentView(layoutRes = […]
Kotlin Standard lib包含接收对象的’with’方法以及定义如下对象的方法: public inline fun with(receiver: T, block: T.() -> R): R = receiver.block() 并可以用作: val str = “string” with(str) { println(size)) // will print 6; equals to “string”.size println(substring(3)) // will print (ing); equals to “string”.substring(3) } 如何在Scala中定义类似的方法?
当试图执行一些Kotlin代码,同时也使用JUnit时,Intellij IDEA将执行代码直到结束,而不是停在断点处。 演示: class Tester { @Test fun shouldBreakpoint() { //Line where threads should suspend: println(“Should Suspend Here”) //Breakpoint added to this line println(“Shouldn’t run this code unless I release above breakpoint”) } } 当点击“Debug Tester”或“Debug shouldBreakpoint”时,不会有断点。 控制台输出两个打印行,没有停在断点处。 如果使用Java编写相同的代码,则调试器将工作: public class Testerino { @Test public void shouldBreakpoint() { System.out.println(“Should Suspend Here”); //Breakpoint added to this […]
我在XML中有几个bean定义来存储我的SQL外部。 我想把它们作为Map注入到Kotlin中Map但是到目前为止,我只能将它注入到Map 。 有没有一种方法来确保types安全。 将它注入为Map会感觉到贫民窟。 当我尝试Map甚至Map我得到不符合条件豆find… XML示例 注入服务 @Service open class JdbcBrandService @Autowired constructor( private val namedJdbcTemplate: NamedParameterJdbcTemplate ): BrandService { companion object { val logger = LoggerFactory.getLogger(JdbcBrandService::class.java) } @Autowired @Qualifier(value = “brandSql”) private lateinit var queries: Map /// methods and what not go here } 在Java中,我可以用类似下面这样的方式逃脱,但Kotlin的types系统更严格似乎阻止了这一点。 @RestController public class JavaBrandController { private final Map […]
我是一个Android开发人员。 结果是由Gradle编写。 我在Groovy上的Gradle DSL上编写了许多任务。 有时我需要动态创建Gradle任务(“即时”)。 这里的例子: task installDebugFlavors() { android.applicationVariants.all { v -> if (v.name.endsWith(‘Debug’)) { String name = v.name.capitalize() dependsOn “install$name” } } } 该任务使用所有的口味组合产生新的任务。 因此,Gradle脚本非常小,易于理解和易于支持。 这是非常强大的Groovyfunction。 而且它经常帮助我。 在新版本的Gradle中引入了新的语言–Kotlin。 我的问题是:是否可以在Kotlin上编写相同的任务(用于动态创建其他任务)?
在Kotlin中使用Injekt库进行dependency injection时: 有时我想注入一个函数,而不是注入一个值。 所以像通过以下方式接收function: val function: (Int) -> Int = Injekt.get() 这似乎工作正常,但不是如果我注册多个函数具有相同的签名,但意义不同。 似乎没有办法区分这些function。 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Injekt + Kotlin主题的习惯性的回答在SO中出现。 其他答案也欢迎,还有其他样式的如何做到这一点! 披露,我是Injekt图书馆的作者。
所以,我有一些这些签名的Java方法(为简单起见,删除了注释和代码体): public class JavaClass { public static E join(E… array) { … } public static E join(CharSequence separator, E… array) { … } } 我在Kotlin中有一些代码,它调用了’join’方法: class KtClass { fun test(vararg array: String) { JavaClass.join(*array) } } 到现在为止还挺好; 它会传播可变参数并称之为方法签名。 好的! 例如,如果我想用“分隔符”参数来调用后一个方法签名,就会出现问题: class KtClass { fun test(vararg array: String) { JavaClass.join(“”, *array) } } 这段代码不会编译。 编译器无法决定调用哪个方法。 错误: […]