小编Jay*_*ard的帖子

我有两个Kotlin扩展方法用于同一个类,但具有不同的通用签名,编译器抱怨

我正在为同一个类编写两个扩展函数:

class Something<T:Any> { ... }
Run Code Online (Sandbox Code Playgroud)

他们看着像是:

fun Something<Int>.toJson(): String = ...
fun Something<Double>.toJson(): String = ...
Run Code Online (Sandbox Code Playgroud)

并导致编译器错误:

Kotlin:平台声明冲突:以下声明具有相同的JVM签名

如何创建两个扩展函数,只有泛型签名不同?还是不可能?

注意: 这个问题是由作者故意编写和回答的(答案问题),因此常见问题的Kotlin主题的答案存在于SO中.它起源于Kotlin松弛的 #general通道.

generics extension-methods kotlin

15
推荐指数
1
解决办法
1453
查看次数

Kotlin stdlib operatios vs for循环

我写了以下代码:

val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)    

for (i in src)
{
    if (i % 2 == 0) dest.add(Math.sqrt(i.toDouble()))
}
Run Code Online (Sandbox Code Playgroud)

IntellJ(在我的例子中是AndroidStudio)问我是否要用stdlib中的操作替换for循环.这导致以下代码:

val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
src.filter { it % 2 == 0 }
   .mapTo(dest) { Math.sqrt(it.toDouble()) }
Run Code Online (Sandbox Code Playgroud)

现在我必须说,我喜欢改变的代码.当我提出类似的情况时,我发现写入比循环更容易.但是在阅读了filter函数的功能后,我意识到与for循环相比,这是一个很慢的代码.filterfunction创建一个新列表,其中仅包含src中与谓词匹配的元素.因此,在stdlib版本的代码中创建了另外一个列表和一个循环.对于小型列表来说,它可能并不重要,但总的来说这听起来不是一个好的选择.特别是如果要连接更多这样的方法,你可以通过编写for循环来获得许多可以避免的额外循环.

我的问题是什么被认为是Kotlin的良好做法.我应该坚持使用循环还是我错过了一些东西而且它不起作用,因为我觉得它有效.

kotlin

15
推荐指数
1
解决办法
2661
查看次数

我想检测JVM类是否是Kotlin类

如果我遇到Kotlin类而不是通用Java类,我想要做特殊功能.如何检测它是否是Kotlin类?

someClass.kotlin如果班级不是Kotlin ,我希望调用会抛出异常或失败.但它包装Java类就好了.然后我注意到,如果我这样做someClass.kotlin.primaryConstructor似乎是null所有java类,即使他们有一个默认的构造函数,这是一个很好的标记?但这也可以null归功于Kotlin课程吗?

什么是最好的方式说"这是一个科特林课程吗?"

reflection kotlin

14
推荐指数
1
解决办法
570
查看次数

Proguard和Kotlin-Reflect/Kotlin Annotations

寻找一些将职业选手放入项目的人的帮助.

kotlin-reflect使用的注释(jackson-module-kotlin v v2.8.8所需的依赖关系)在升级到kotlin 1.1.2-3之后被剥离.proguard的错误是: Warning:kotlin.reflect.jvm.internal.impl.descriptors.CallableDescriptor: can't find referenced class org.jetbrains.annotations.ReadOnly

这种情况发生在一些注释中,而不仅仅是ReadOnly.我们尝试添加一个好的'捕获所有,但错误仍然存​​在:

-keep class org.jetbrains.kotlin.** { *; }
-keep class org.jetbrains.annotations.** { *; }
-keepclassmembers class ** {
  @org.jetbrains.annotations.ReadOnly public *;
}
Run Code Online (Sandbox Code Playgroud)

纵观源ReadOnly这是一个@interfacejava.lang.annotations.*进口@Documented,@RetentionPolicy.CLASS,@Target

proguard kotlin kotlin-reflect

14
推荐指数
2
解决办法
3973
查看次数

可见性不与Kotlin合作

嗨,下面给出的是我的代码,我的按钮应该变得不可见但是INVISIBLE不起作用

fun onPlay(view: View){
         var play = findViewById(R.id.play) as Button
         play.isClickable=false
         play.visibility=view.INVISIBLE
}
Run Code Online (Sandbox Code Playgroud)

android kotlin

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

Javadoc @link 到 Kotlin 类

这是我的 javadoc

/**
 * If you wish to add this fragment to your activity, you must implement {@link com.example.app.BlaActivity BlaActivity}
 *
 * @return an instance of BlaFragment
 */
Run Code Online (Sandbox Code Playgroud)

BlaActivity是一个 Kotlin 类。当我将鼠标悬停在上面带有 javadoc 的方法上时,弹出窗口显示:

If you wish to add this fragment to your activity, you must implement

Returns:
        an instance of BlaFragment
Run Code Online (Sandbox Code Playgroud)

因此,它不会在弹出窗口中显示我的 Kotlin 类。但是,当我使用 Java 类时它工作正常。

Javadoc 不支持 Kotlin 类?

java javadoc kotlin

11
推荐指数
2
解决办法
2473
查看次数

如何在kotlin中制作密封类通用?

是否可以使用下面的AsyncResult类来防止在UserDataAppResult和CreateUserResult中重新定义InFlight,Error和InFlight?

//TODO: use this to make the below classes generic?
sealed class AsyncResult{
  object InFlight : AsyncResult()
  data class Error(val errorMessage: String) : AsyncResult()
  data class Loaded<out T>(val users: T) : AsyncResult()
}

sealed class UserDataAppResult : AppResult() {
  object InFlight : UserDataAppResult()
  data class Error(val errorMessage: String) : UserDataAppResult()
  data class Loaded(val users: List<User>) : UserDataAppResult()
}

sealed class CreateUserResult : AppResult() {
  object InFlight : CreateUserResult()
  data class Error(val errorMessage: String) : CreateUserResult()
  data class Loaded(val users: User) …
Run Code Online (Sandbox Code Playgroud)

kotlin

10
推荐指数
3
解决办法
3998
查看次数

从Java调用Kotlin内联函数

Exceptions.kt:

@Suppress("NOTHING_TO_INLINE")
inline fun generateStyleNotCorrectException(key: String, value: String) =
        AOPException(key + " = " + value)
Run Code Online (Sandbox Code Playgroud)

在kotlin:

fun inKotlin(key: String, value: String) {
    throw generateStyleNotCorrectException(key, value) }
Run Code Online (Sandbox Code Playgroud)

它在kotlin中工作,并且函数是内联的.

但是当在Java代码中使用时,它只是无法内联,并且仍然是一个正常的静态方法调用(从反编译的内容中看到).

像这样的东西:

public static final void inJava(String key, String value) throws AOPException {
    throw ExceptionsKt.generateStyleNotCorrectException(key, value);
// when decompiled, it has the same contents as before , not the inlined contents.
}
Run Code Online (Sandbox Code Playgroud)

inline kotlin kotlin-interop

10
推荐指数
1
解决办法
2695
查看次数

从我的Maven项目的上下文中运行Kotlin REPL?

如何在我的Maven项目中运行Kotlin REPL?

这有效,但很难看:

kotlinc-jvm -cp target/classes/:`ruby -e "puts Dir['target/**/*.jar'].join(':')"`
Run Code Online (Sandbox Code Playgroud)

我在下面尝试了不同的变体(在使用Maven将编译器JAR复制为依赖项之后),但没有任何作用(Error: Could not find or load main class org.jetbrains.kotlin.runner.Main):

<plugin>  
  <groupId>org.codehaus.mojo</groupId> 
  <artifactId>exec-maven-plugin</artifactId> 
  <version>1.1.1</version> 
  <executions>
    <execution>
    <goals>
      <goal>exec</goal> 
    </goals>
    </execution>
  </executions>
  <configuration>
    <executable>java</executable>
    <arguments>
      <argument>-classpath</argument>
      <classpath/>
      <argument>-classpath</argument>
      <argument>${project.basedir}/target/dependency/kotlin-compiler-1.0.0.jar</argument>
      <argument>org.jetbrains.kotlin.runner.Main</argument>
    </arguments>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

read-eval-print-loop kotlin

9
推荐指数
1
解决办法
889
查看次数

Elasticsearch:过滤器顺序以获得最佳性能

Elasticsearch指南说

"每个过滤器都是独立计算和缓存的,无论它在何处使用.如果两个不同的查询使用相同的过滤器,则将重用相同的过滤器位集.同样,如果单个查询在多个位置使用相同的过滤器,则只有一个位集计算然后重复使用." (https://www.elastic.co/guide/en/elasticsearch/guide/current/filter-caching.html)

在另一页上它还说:

"bool子句中的过滤器顺序对于性能很重要.更具体的过滤器应该放在不太具体的过滤器之前,以尽可能多地排除尽可能多的文档.如果条款A可以匹配1000万个文档,条款B只能匹配100份文件,则条款B应放在条款A之前." (https://www.elastic.co/guide/en/elasticsearch/guide/current/_filter_order.html)

我不太明白当每个过滤器独立缓存时,bool子句中的过滤器顺序是如何重要的.

我认为从缓存执行或检索子句B,从缓存执行或检索子句A,然后过滤器位集"合并".为什么订单很重要?

performance elasticsearch

8
推荐指数
2
解决办法
4967
查看次数