标签: kotlin

从Java访问Kotlin扩展函数

是否可以从Java代码访问扩展函数?

我在Kotlin文件中定义了扩展函数.

package com.test.extensions

import com.test.model.MyModel

/**
 *
 */
public fun MyModel.bar(): Int {
    return this.name.length()
}
Run Code Online (Sandbox Code Playgroud)

哪个MyModel是(生成的)java类.现在,我想用我的普通java代码访问它:

MyModel model = new MyModel();
model.bar();
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.IDE将无法识别该bar()方法,并且编译失败.

使用kotlin的静态函数可以使用什么:

public fun bar(): Int {
   return 2*2
}
Run Code Online (Sandbox Code Playgroud)

通过使用import com.test.extensions.ExtensionsPackage所以我的IDE似乎正确配置.

我搜索了kotlin文档中的整个Java-interop文件,并搜索了很多内容,但我找不到它.

我究竟做错了什么?这甚至可能吗?

java kotlin extension-function

123
推荐指数
5
解决办法
3万
查看次数

"更喜欢在Kotlin上运行匕首处理器"

每当我注入kotlin类时,我都会在构建中得到这个注释(顺便说一下,我有一个混合的android项目同时使用kotlin和java).

例如,在这个gradle任务之后:compileStagingDebugJavaWithJavac(StagingDebug是我的构建变体),我收到以下消息:

"注意:为com.packageNameXXX.CourseDiscoveryMapFragment生成一个MembersInjector或Factory.更喜欢在该类上运行dagger处理器."

我的CourseDiscoveryMapFragment代码可以在这里看到:

class CourseDiscoveryMapFragment : Fragment(){

    @Inject
    lateinit var presenter: CourseDiscoveryMapPresenter

    lateinit var mapView: MapView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.fragment_discovery_map, container, false)

        MapsInitializer.initialize(activity)

        mapView = view.mapView
        mapView.onCreate(savedInstanceState?.getBundle(BUNDLE_KEY_MAP_STATE))

        (activity as BaseActivity)
                .activityComponent.inject(this)
}
Run Code Online (Sandbox Code Playgroud)

我的ActivityComponent是:

@ActivityScope
@Subcomponent(modules = ActivityModule.class)
public interface ActivityComponent {

    void inject(BaseActivity baseActivity);

    void inject(CourseDiscoveryMapFragment fragment);

    //Exposed to sub-graphs.
    Activity activity();
}
Run Code Online (Sandbox Code Playgroud)

所以,我有用Java编写的匕首组件和模块,同时在Kotlin中进行匕首注射.

这是我应该担心的吗?

谢谢.

android kotlin dagger

123
推荐指数
1
解决办法
3926
查看次数

我如何在Kotlin中获得一个随机数?

一种通用方法,可以返回2个参数之间的随机整数,如ruby rand(0..n).

有什么建议吗?

random jvm kotlin

122
推荐指数
11
解决办法
7万
查看次数

Kotlin协同程序中的launch/join和async/await之间有什么区别

kotlinx.coroutines库中,您可以使用launch(with join)或async(with await)启动新的协同程序.他们之间有什么区别?

asynchronous coroutine kotlin kotlin-coroutines

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

如何在Kotlin中实现Builder模式?

嗨,我是Kotlin世界的新手.我喜欢到目前为止所看到的并开始考虑将我们在Java应用程序中使用的一些库转换为Kotlin.

这些库充满了带有setter,getter和Builder类的Pojos.现在我用谷歌搜索了什么是在Kotlin中实施Builders的最佳方法,但没有成功.

第二次更新:问题是如何在Kotlin中使用一些参数为简单的pojo编写Builder设计模式?下面的代码是我尝试编写java代码然后使用eclipse-kotlin-plugin转换为Kotlin.

class Car private constructor(builder:Car.Builder) {
    var model:String? = null
    var year:Int = 0
    init {
        this.model = builder.model
        this.year = builder.year
    }
    companion object Builder {
        var model:String? = null
        private set

        var year:Int = 0
        private set

        fun model(model:String):Builder {
            this.model = model
            return this
        }
        fun year(year:Int):Builder {
            this.year = year
            return this
        }
        fun build():Car {
            val car = Car(this)
            return car
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

design-patterns kotlin

121
推荐指数
5
解决办法
4万
查看次数

Android AsyncTask API 在 Android 11 中弃用。有哪些替代方案?

Google 正在弃用 Android 11 中的 Android AsyncTask API,并建议java.util.concurrent改用。你可以在这里查看提交

 *
 * @deprecated Use the standard <code>java.util.concurrent</code> or
 *   <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
 *   Kotlin concurrency utilities</a> instead.
 */
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Run Code Online (Sandbox Code Playgroud)

如果您在 Android 中维护带有异步任务的旧代码库,则将来可能需要对其进行更改。我的问题是,使用java.util.concurrent. 它是一个 Activity 的静态内部类。我正在寻找可以使用的东西minSdkVersion 16

private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
        private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
        private WeakReference<MyActivity> activityReference;

        LongRunningTask(MyActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected MyPojo doInBackground(String... params) { …
Run Code Online (Sandbox Code Playgroud)

java android kotlin kotlin-coroutines

120
推荐指数
9
解决办法
9万
查看次数

Kotlin和JPA:默认构造函数地狱

正如JPA所要求的那样,@Entity类应该有一个默认(非arg)构造函数,用于在从数据库中检索对象时实例化对象.

在Kotlin中,在主构造函数中声明属性非常方便,如下例所示:

class Person(val name: String, val age: Int) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

但是当非arg构造函数被声明为次要构造函数时,它需要传递主构造函数的值,因此需要它们的一些有效值,如下所示:

@Entity
class Person(val name: String, val age: Int) {
    private constructor(): this("", 0)
}
Run Code Online (Sandbox Code Playgroud)

在情况下,当性能有一些更复杂的类型不只是StringInt他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init块,当这些参数都在积极使用- - 当他们通过反射重新分配时,大部分代码将再次执行.

此外,val在构造函数执行后,-properties不能重新分配,因此不可变性也会丢失.

所以问题是:Kotlin代码如何适应JPA而不需要代码重复,选择"神奇"的初始值和失去不变性?

PS除了JPA之外,Hibernate是否可以构造没有默认构造函数的对象?

hibernate jpa default-constructor kotlin

113
推荐指数
6
解决办法
4万
查看次数

Kotlin:如何将函数作为参数传递给另一个?

给定函数foo:

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}
Run Code Online (Sandbox Code Playgroud)

我们可以做的:

foo("a message", { println("this is a message: $it") } )
//or 
foo("a message")  { println("this is a message: $it") }
Run Code Online (Sandbox Code Playgroud)

现在,假设我们有以下功能:

fun buz(m: String) {
   println("another message: $m")
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将"buz"作为参数传递给"foo"?就像是:

foo("a message", buz)
Run Code Online (Sandbox Code Playgroud)

kotlin

112
推荐指数
5
解决办法
5万
查看次数

使用布尔值?如果表达

如果我有一个可空的Boolean b,我可以在Java中进行以下比较:

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,我可以通过使用!!运算符来实现相同的目的:

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}
Run Code Online (Sandbox Code Playgroud)

然而,!!对我来说使用感觉有点粗略,绕过零安全系统.

有更优雅的方法吗?


编辑似乎我有点过分了.对于局部变量,如Banthar所示,它确实有效.但是,我的布尔b实际上是一个"具有支持字段的属性"(我实际上并没有达到速度,而是强加了它).这是结果:

在此输入图像描述

null kotlin

112
推荐指数
4
解决办法
4万
查看次数

Kotlin中的常数 - 建议创建它们的方法是什么?

如何在Kotlin中创建常量?什么是命名惯例?我没有在文档中找到它.

companion object {
    //1
    val MY_CONST = "something"

    //2
    const val MY_CONST = "something"

    //3
    val myConst = "something"
}
Run Code Online (Sandbox Code Playgroud)

要么 ...?

android constants kotlin

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