我对Koltin lambdas感到有点困惑,我想知道如何使用它,因为有以下代码片段:
interface KotlinInterface {
fun doStuff(str: String): String
}
以及要求将此接口作为参数传递的函数:
fun kotlinInterfaceAsArgument(kotlinInterface: KotlinInterface): String{
return kotlinInterface.doStuff("This was passed to Kotlin Interface method")
}
fun
我有一个存储resultClass的类,我想做一些类型检查,并确保用户在调用getTypeSafeResults函数时获得类型安全列表。
class MyClass<T>(
private val resultClass: Class<T>
){
fun getTypeSafeResults() : List<T> {
val results: List<Any?> = remoteFetchResults()
return results.filterIsInstance(resultClass)
我知道您不能使用Java中的委托属性语法,也不会像Kotlin那样方便地“重写”set/get操作符,但我仍然希望在Java中使用现有的属性委托。
例如,int的简单委托:
class IntDelegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = 0
}
当然,在Kotlin,我们可以这样使用:
val x by IntDelegate()
但是我们如何在Java中以某种形式使用IntDelegate呢?我相信这是一个开始:
final IntDelegate x = new Int
我正在实现一个纯Kotlin库,我将在开源许可证下发布该库。在我的库中,假设有class A,我想在其中重写equals()。我使用了Android Studio的自动生成器来做这件事,但它包含了对javaClass的引用 override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as A
...
} 在纯Kotlin库中使用此参考资料安全吗?如果有人使用我的库来攻击J
如果我试图访问泛型类型T的javaClass,Kotlin编译器会抱怨T不是kotlin.Any的子类型
class Foo<T> (val t: T ){
val cls = t.javaClass // Error, T is not a subtype of kotlin.Any
}
如果将T定义为任何事物的子类型,那么一切正常。
class Bar<T:Any> (val t: T ){
val cls = t.javaClass // OK
}
( Q1)如果“T”类型不是“任何”的子类型,那么它可以是哪个类/类的子类型?
Q2)对于T的所有实
在这个问题上已经有几个问答,但对我来说,他们似乎谈到了不同的事情(大多数情况下是安卓的Kotlin + Dagger2 ),并不适用于我的具体情况。 我正在通过阅读this blog post来学习“短剑”。我尝试使用Kotlin,而不是使用该博客中的Java代码。 因此,House.kt as接口: interface House {
fun prepareForWar()
fun reportForWar()
} 原样BoltonsDagger.kt class BoltonsDagger @Inject constructor(): House {
overri
我想设置Guice绑定,所以我在Java中创建了一个运行良好的模块:
public class CrashLoggerModule extends AbstractModule {
@Override
public void configure() {
bind(CrashLogger.class).to(ConcreteCrashLogger.class);
}
}
然后我把这个代码转换成Kotlin:
public class CrashLoggerModule : AbstractModule() {
override fun config
简单地说,在Kotlin (如kotlin.io.println )中,一个引用/迭代如何在重载的顶层函数上进行反射。
鉴于以下情况:
object Bar {
fun foo(x: Int) = Unit
fun foo(x: Byte) = Unit
fun foo(x: Float) = Unit
}
通过执行以下操作,我可以遍历foo的各种重载:
fun main() {
Bar::class.memberFunctions
.filter { kFunction -> kFunction.name == "foo"
因此,我有一些带有这些签名的Java方法(为了简单起见,删除了注释和代码体):
public class JavaClass {
public static <E extends CharSequence> E join(E... array) { ... }
public static <E extends CharSequence> E join(CharSequence separator, E... array) { ... }
}
我在Kotlin中有一些代码,它调用'join‘方法:
class KtClass {
fun test(
主要问题:如何在java中重写kotlin方法,该方法返回Unit类型?
我试图在java中使用kotlin库,并且有一个名为override fun invoke(): Unit的方法,我必须实现它。
但是,java编译器一直告诉我return type void is not compatible with Unit。
我在java中尝试了public Unit invoke() { return Unit.INSTANCE; },但是出现了编译错误。
invoke()' in 'myproject' clashes with 'invoke()'
给出以下Kotlin注释:
public Retention(RetentionPolicy.RUNTIME) annotation class foo(val text : String)
以及下面的代码来检查一个类是否被上面的注释所注释:
if (javaClass<Bar>().isAnnotationPresent(javaClass<foo>())) {
// do something here.
}
如果注释类(foo)和使用它的代码位于同一个模块(maven工件)中,则代码可以编译和运行,不会出现任何问题。
但是,如果将它们分成不同的模块,则会发生
假设我有一个数据类,它有三个属性:
data class Product(
val id: Int,
val name: String,
val manufacturer: String)
如果我正确理解,Kotlin将使用这三个属性生成equals()和hashCode(),如下所示:
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return f
我已经为属性创建了一个注释,现在我希望在运行时通过反射阅读它。在我看来,我做的一切都是正确的,但没有注释。
为什么注释不可用?
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER)
annotation class MyAnnotation
class MyClass(@MyAnnotation val attr: List<String>)
fun main(args: Array<String>) {
这是我的KotlinInterface.kt
interface KotlinInterface {
fun fun1()
fun fun2()
}
这是我的JavaClass.java
public class JavaClass {
public KotlinInterface test() {
return new KotlinInterface() {
@Override
public void fun2() {
}
@Override
public void fun1() {
下面的代码片段显示了测试从不同来源获得的Kotlin KClass引用的相等性的结果。它们的字符串表示是相同的。但是它们的java类是不同的。预期c、c0和c1是相等的。但出于某种原因他们不是。
是有细微差别还是有窃听器?如果不是bug,那么测试KClasses的等式的可靠方法是什么?
fun main(args: Array<String>) {
val c = Int::class
fun test(v0: Any, v1: Any) {
val c0 = v0.javaClass.kotlin
val c1 = v1.javaC
在我的代码中,我得到了一个io.vertx.core.json.JsonArray,我想要一个JsonObjects列表。因此,在Java语言中,我调用了jsonarray.getList()和get List - getList()返回一个java.util.List。
所以在Kotlin中
var list: List<JsonObject> = jsonArray.getList()
但是我得到了一个错误
Type mismatch: inferred type is kotlin.collections.(Mutable)List<(raw) kotlin.Any?&
我在玩反光游戏,我想出了这个问题。当通过::class语法使用绑定类引用时,我得到了一个协变量KClass类型:
fun <T> foo(entry: T) {
with(entry::class) {
this // is instance of KClass<out T>
}
}
正如我可以从文档中学到的那样,这将返回对象的确切类型,以防它是T子类型的实例,因此是方差修饰符。但是,这会阻止检索在T类中声明的属性并获取它们的值(这正是我要做的)
fun <T> foo(entry: T) {
with(entry::c
在Kotlin中,我可以将Any转换为另一种类型,如下所示 val obj: Any = 123
val num: Int = obj as Int 在我的例子中,我希望能够强制转换为Class<Int>或KClass<Int>,类似于... val obj: Any = 123
val kotlinClass = Int::class
val javaClass = Int::class.java
val num : Int = obj.castTo(kotlinClass)
val num2: Int = obj.castTo(javaClass) 究竟如何才能
在尝试将带有嵌套泛型的Java代码转换为Kotlin时,我遇到了一些困难。以这个Java SSCCE为例(请注意S和T之间的关系):
public class JavaTest {
private class JavaObjectContainer<S> {
public S obj;
}
private abstract class JavaSampleClass<S, T extends JavaObjectContainer<S>> {
private Class<S> type;
public J
我正在通过编译器运行一些代码,我必须查询用户使用哪个操作系统来调用适当的二进制文件。代码可以工作,并在IntelliJ中调用二进制文件,但是当我使用gradle构建jar文件时,在与tempBinaryCopy对应的行中得到一个未找到的异常(二进制文件)。
fun assemble(file: String) {
val currentDirectory = System.getProperty("user.dir")
val binary = when {
System.getProperty("os.name").sta