为什么我不能让每一个Kotlin类都成为一个数据类?

当然,我排除了任何涉及违反数据类规则的理由。 所以如果你知道你不需要inheritance它(虽然我的理解是规则在Kotlin1.1中消失)。 制作一个数据类有什么不利之处? 为什么所有符合条件的类都只能提供数据类的function呢? 这应该都可以被编译器检测到而不需要特殊的关键字。 当然这个答案可能是显而易见的,取决于问题1的答案。 我是否有理由不把所有符合条件的类标记为数据类?

使用Gradle编译Kotlin jar时,在META-INF中生成无效的元数据

我最近遇到了一个内部编译器exception,当试图包括一个jar(其中包含从另一个Kotlin项目编译的类): java.io.FileNotFoundException: /home/[myUsername]/.m2/repository/com/my/library/1.0.0-SNAPSHOT/library-1.0.0-SNAPSHOT.jar!/META-INF/moduleName_main.kotlin_module at org.jetbrains.kotlin.com.intellij.openapi.vfs.impl.ZipHandler.contentsToByteArray(ZipHandler.java:233) at org.jetbrains.kotlin.com.intellij.openapi.vfs.impl.jar.CoreJarVirtualFile.contentsToByteArray(CoreJarVirtualFile.java:125) at org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider.processNotLoadedRelevantRoots(JvmPackagePartProvider.kt:67) at org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider.findPackageParts(JvmPackagePartProvider.kt:40) at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment$binaryClasses$2.invoke(LazyJavaPackageFragment.kt:37) at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment$binaryClasses$2.invoke(LazyJavaPackageFragment.kt:32) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:321) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:362) at org.jetbrains.kotlin.storage.StorageKt.getValue(storage.kt:39) at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment.getBinaryClasses$kotlin_compiler(LazyJavaPackageFragment.kt) at org.jetbrains.kotlin.load.java.lazy.descriptors.JvmPackageScope$kotlinScopes$2.invoke(JvmPackageScope.kt:44) at org.jetbrains.kotlin.load.java.lazy.descriptors.JvmPackageScope$kotlinScopes$2.invoke(JvmPackageScope.kt:36) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:321) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:362) at org.jetbrains.kotlin.storage.StorageKt.getValue(storage.kt:39) at org.jetbrains.kotlin.load.java.lazy.descriptors.JvmPackageScope.getKotlinScopes(JvmPackageScope.kt) at org.jetbrains.kotlin.load.java.lazy.descriptors.JvmPackageScope.getContributedClassifier(JvmPackageScope.kt:55) at org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope.getContributedClassifier(ChainedMemberScope.kt:33) at org.jetbrains.kotlin.resolve.scopes.AbstractScopeAdapter.getContributedClassifier(AbstractScopeAdapter.kt:41) at org.jetbrains.kotlin.resolve.lazy.FileScopeFactory$currentPackageScope$1.getContributedClassifier(FileScopeFactory.kt:153) at org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt.findClassifier(ScopeUtils.kt:74) at org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.resolveDescriptorForType(QualifiedExpressionResolver.kt:74) at org.jetbrains.kotlin.resolve.TypeResolver.resolveDescriptorForType(TypeResolver.kt:577) at org.jetbrains.kotlin.resolve.TypeResolver$resolveTypeElement$1.visitUserType(TypeResolver.kt:159) at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:905) at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:21) […]

为什么我们有在Kotlin中命名为componentN的函数?

我刚刚看了Kotlin 标准库 ,发现了一些奇怪的扩展函数叫做componentN ,其中N是从1到5的索引。 有所有types的原语的函数。 例如: /** * Returns 1st *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun IntArray.component1(): Int { return get(0) } 它看起来好奇。 我对开发者的动机很感兴趣。 调用array.component1()而不是array[0]更好吗?

如何通过在Kotlin中使用枚举转换为NotNull

如何使用Kotlin将以下代码转换为enum类中的NotNull ? 注意:我在两个活动之间使用这个枚举,一个活动有两个适配器。 这里是枚举类 enum class Adapterx { ADAPTER_1, ADAPTER_2; companion object { fun fromOrdinal(ordinal: Int): Adapterx? { return Adapterx.values().firstOrNull { it.ordinal == ordinal } } } }

DialogFragment中的Kotlin合成和自定义布局

比方说,我有这样的布局: 我在DialogFragment中使用它: class DepartmentChoiceDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(activity) builder.setTitle(R.string.choose_or_create_dep) .setView(R.layout.department_chooser_dialog) .setNegativeButton(android.R.string.cancel, { d, i -> d.cancel() }) return builder.create() } } 如果我参考使用合成的小部件: override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dep_list.layoutManager = LinearLayoutManager(activity) dep_list.itemAnimator = DefaultItemAnimator() dep_list.setHasFixedSize(true) } 我在运行时遇到这个错误: java.lang.NullPointerException:尝试在MyDialog的空对象引用上调用虚拟方法’android.view.View android.view.View.findViewById(int)’._ $ _ findCachedViewById(DepartmentChoiceDialog.kt:0) 我不明白如何在DialogFragment的情况下使用合成。 它在Fragment和Activity中工作正常。

在ReactDOMBuilder.render中引用div的正确方法是什么?

我一直在转换这个代码: https://github.com/Kotlin/kotlin-fullstack-sample/blob/master/frontend/src/org/jetbrains/demo/thinkter/HomeView.kt 以我自己的需要,并得到了一个点,在我需要做的渲染方法: val div = document.getElementById(“map”) kotlinGoogleMap(div) 这来自https://blog.frankel.ch/kotlin-front-end-developers/,所以我试图调用的实际线路是这里的第33行https://github.com/nfrankel/kotlin-frontend/blob /master/src/script.kt#L33 有没有从我的HomeView.kt渲染方法做到这一点的好方法?

从kotlin的另一个创建集合

我想从一个集合中获取某个元素来创建另一个元素。 示例我有一个从这个对象创建的列表 Student (Id, Code, FirstName, LastName, Age, Birthday)` 我想从第一个包含特定字段示例的集合创建一个新的集合 NewStudent(FirstName, LastName, Age) 我试图使用map ,但我不能得到正确的结果。

Kotlin属性与getter。 我可以不指定初始值吗?

我想创建一个单例类,但不幸的是,Android几乎所有东西都需要Context,所以我需要它创建一个实例。 所以我只是假设用户名为init() ,然后返回实例。 正如你在下面看到的那样,如果_instance为null,则会抛出exception,所以get方法不能返回null。 但Kotlin说我必须初始化instance 。 事情是,MyClass不能没有上下文创建。 所以我不想指定一个初始值。 我怎样才能做到这一点? companion object { protected var _instance:MyClass? = null; fun init(context:Context) { _instance = MyClass(context) } var instance:MyClass //<—This causes a compile error. get() { if(_instance==null) throw RuntimeException("Call init() first."); return _instance!!; } }

递归列表中的Kotlin无限循环

这遵循无限循环,在clojure这样的事情就好了 tailrec fun passHeaders (xH: List) { while (xH.isNotEmpty()) { passHeaders(xH.drop(1)) } }

如何调试Kotlin序列/集合

采取以下一行,可以表示为一个集合或序列上的一系列操作: val nums = (10 downTo 1) // .asSequence() if we want this to be a sequence .filter { it % 2 == 0 } .map { it * it } .sorted() // .asList() if declaring it a sequence println(nums) // [4, 16, 36, 64, 100] 比方说,我想看看每一步的元素,他们会(从扣除): [10, 9, 8, 7, 6, 5, 4, 3, […]