我正在为同一个类编写两个扩展函数:
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通道.
我写了以下代码:
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类而不是通用Java类,我想要做特殊功能.如何检测它是否是Kotlin类?
someClass.kotlin如果班级不是Kotlin ,我希望调用会抛出异常或失败.但它包装Java类就好了.然后我注意到,如果我这样做someClass.kotlin.primaryConstructor似乎是null所有java类,即使他们有一个默认的构造函数,这是一个很好的标记?但这也可以null归功于Kotlin课程吗?
什么是最好的方式说"这是一个科特林课程吗?"
寻找一些将职业选手放入项目的人的帮助.
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这是一个@interface与java.lang.annotations.*进口@Documented,@RetentionPolicy.CLASS,@Target
嗨,下面给出的是我的代码,我的按钮应该变得不可见但是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) 这是我的 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 类?
是否可以使用下面的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) 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) 如何在我的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) 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,然后过滤器位集"合并".为什么订单很重要?
kotlin ×9
android ×1
generics ×1
inline ×1
java ×1
javadoc ×1
performance ×1
proguard ×1
reflection ×1