定义没有inheritance的公共属性

有没有在Kotlin中使用inheritance来定义公共属性的方法? 例如 如果我有两个类都需要一个“ID”属性。 class Dog() { var id: UUID? } class Cat() { var id: UUID? } 解决这个问题的一般JAVA方法是引入一个超级类 class Animal() { var id: UUID? } class Dog: Animal() class Cat: Animal() 但是现在“狗”和“猫”是“动物”的types。 如果我介绍一个“主席”类,也需要一个唯一的标识符呢? 本质上,我想创建一组属性的能力,我可以包含在许多不同的类中,以方便编程。 我不希望所有与inheritance有关的问题。

Gradle脚本Kotlin中的锅炉项目配置

我正在尝试改进我们的项目共享他们的配置的方式。 我们有许多不同的多模块gradle项目,用于我们的所有库和微服务(即许多git仓库)。 我的主要目标是: 为了不让我的Nexus存储库配置在每个项目中都重复(另外,我可以放心地认为URL不会改变) 为了使我的自定义Gradle插件(发布到Nexus)可用于每个项目,最小的样板/重复(他们应该可用于每个项目,该项目唯一关心的是它使用的版本) 没有魔法 – 开发人员应该很明白怎样配置一切 我目前的解决方案是一个定制的gradle分发与初始化脚本: 将mavenLocal()和我们的Nexus存储库添加到项目回购(非常类似于Gradle 初始化脚本文档示例 ,除了添加回购以及validation它们) 配置允许我们的gradle插件添加到buildscript类路径的扩展(使用此解决方法 )。 它还将我们的Nexus回购作为buildscript回购添加,因为这是插件托管的地方。 我们有很多插件(建立在Netflix优秀的星云插件上 ),用于各种样板:标准项目设置(kotlin设置,测试设置等),发布,发布,文档等等,这意味着我们的项目build.gradle文件非常多只是为了依赖。 这里是初始化脚本(消毒): /** * Gradle extension applied to all projects to allow automatic configuration of Corporate plugins. */ class CorporatePlugins { public static final String NEXUS_URL = “https://example.com/repository/maven-public” public static final String CORPORATE_PLUGINS = “com.example:corporate-gradle-plugins” def buildscript CorporatePlugins(buildscript) { […]

以像素为单位获取屏幕尺寸

我创建了一些自定义元素,我想以编程方式将它们放在右上角(从顶部边缘n像素,从右边缘m像素)。 因此,我需要获取屏幕宽度和屏幕高度,然后设置位置: int px = screenWidth – m; int py = screenHeight – n; 我如何在主Activity中获取screenWidth和screenHeight ?

锁定Kotlin中的serialVersionUID

我一整个早上都在serialVersionUID地锁定一个Kotlin类的serialVersionUID 。 我有一个由Project扩展的BaseModel abstract class BaseModel( var id: Int? = null, private val fileName: String, private val data: MutableList, private val indices: MutableMap ) : Serializable { … protected fun writeToDisk() { val oos = ObjectOutputStream(BufferedOutputStream(FileOutputStream(fetchFileName())) ) oos.writeObject(fetchData()); oos.close(); } } 和项目类: class Project( var name: String = “”, var repo: String = “” ) […]

如何避免CollapsingToolbarLayout不被捕捉或滚动时“摇晃”?

背景 假设你已经创建了一个应用程序,它有一个类似于你可以通过“滚动活动”向导创建的UI,但是你希望滚动标志具有对齐性,例如: 问题 事实certificate,在许多情况下,它具有捕捉问题。 有时UI不会捕捉到顶部/底部,使CollapsingToolbarLayout停留在之间。 有时它也会尝试一个方向,然后决定打到另一个方向。 您可以在这里看到所附video的两个问题。 我试过了 我认为这是我在RecyclerView中使用setNestedScrollingEnabled(false)时得到的问题之一,所以我在这里问了一下 ,但后来我注意到,即使使用解决方案,根本不使用此命令,甚至在使用一个简单的NestedScrollView(由向导创建),我仍然可以注意到这种行为。 这就是为什么我决定在这里报告这个问题。 可悲的是,我无法findStackOverflow上那些奇怪的错误的解决方法。 这个问题 为什么会发生,更重要的是:我怎样才能避免这些问题,同时仍然使用它应该有的行为? 编辑:这是一个不错的改进Kotlin版本的接受答案: class RecyclerViewEx @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : RecyclerView(context, attrs, defStyle) { private var mAppBarTracking: AppBarTracking? = null private var mView: View? = null private var mTopPos: Int = 0 private var mLayoutManager: LinearLayoutManager? […]

Kotlin – 具有私人构造函数的工厂函数

在Kotlin中,是否可以有一个工厂函数来创建一个具有私有构造函数的类的实例? 我的目标是强制使用工厂函数,并防止通过类的构造函数实例化。 例: // factory function, valid val myInstance = myClassOf() // class instantiation, invalid val myInstance = MyClass() 我试图模仿一些像intArrayOf()这样的内置工厂函数的行为,例如 // works val myIntArray = intArrayOf() // not possible as IntArray has a private constructor val myIntArray = IntArray()

Kotlin迭代器列表?

我有一个来自JsonNode fieldNames字符串的迭代器: val mm = … //JsonNode val xs = mm.fieldNames() 我想循环的领域,同时保持计数,如下所示: when mm.size() { 1 -> myFunction1(xs[0]) 2 -> myFunction2(xs[0], xs[1]) 3 -> myFunction3(xs[0], xs[1], xs[2]) else -> print(“invalid”) } 很明显,上面的代码不起作用,因为迭代器不能像这样索引。 我试图看看是否可以通过mm.toList()将迭代器转换为列表,但不存在。 我怎样才能做到这一点?

如何在kotlin中使用elvis运算符时否定布尔expression式?

我想否定下面的expression式: return SpUtils.loadEMail()?.isEmpty() ?: false 如果我添加一个! 之前的表情,像 return !SpUtils.loadEMail()?.isEmpty() ?: false IDE(Android Studio)告诉我 在kotlin.Booleantypes的可为null的接收方中只允许使用安全(?)或非null断言(!!)调用? 我如何否定这种表情?

在Kotlin中使用“大于”,“小于”比较可空整数的正确方法是什么?

var _age: Int? = 0 public var isAdult: Boolean? = false get() = _age?.compareTo(18) >= 0 这仍然给我一个空安全,编译错误,但我怎么能在这个问题上使用>, =或<=?

引用扩展function?

是否有可能得到一个扩展function的引用,就像你可能为通常的function所做的(见这里 )? 我期望下面的代码来编译,但现在::String.toSomething是未知的: fun String.toSomething() = length + 1 val some = listOf(“lala”, “bebebe”).map(::String.toSomething)