是否可以从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文件,并搜索了很多内容,但我找不到它.
我究竟做错了什么?这甚至可能吗?
每当我注入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中进行匕首注射.
这是我应该担心的吗?
谢谢.
一种通用方法,可以返回2个参数之间的随机整数,如ruby rand(0..n).
有什么建议吗?
在kotlinx.coroutines库中,您可以使用launch(with join)或async(with await)启动新的协同程序.他们之间有什么区别?
嗨,我是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) 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) 正如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)
在情况下,当性能有一些更复杂的类型不只是String和Int他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init块,当这些参数都在积极使用- - 当他们通过反射重新分配时,大部分代码将再次执行.
此外,val在构造函数执行后,-properties不能重新分配,因此不可变性也会丢失.
所以问题是:Kotlin代码如何适应JPA而不需要代码重复,选择"神奇"的初始值和失去不变性?
PS除了JPA之外,Hibernate是否可以构造没有默认构造函数的对象?
给定函数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) 如果我有一个可空的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实际上是一个"具有支持字段的属性"(我实际上并没有达到速度,而是强加了它).这是结果:
如何在Kotlin中创建常量?什么是命名惯例?我没有在文档中找到它.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Run Code Online (Sandbox Code Playgroud)
要么 ...?