是否可以从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文件,并搜索了很多内容,但我找不到它.
我究竟做错了什么?这甚至可能吗?
我的logcat中有一个警告:
W/art: Verification of void com.myapp.LoginFragment$override.lambda$logIn$5(com.myapp.LoginFragment, java.lang.Throwable) took 217.578ms
Run Code Online (Sandbox Code Playgroud)
这是代码:
subscription = viewModel.logIn()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
this::showStudioSelection,
error -> {
ErrorResponse errorResponse = ErrorResponseFactory.create(error);
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
Snackbar.make(getView(), R.string.login_bad_credentials, Snackbar.LENGTH_LONG)
.setAction(android.R.string.ok, v -> {})
.show();
} else {
Snackbar.make(getView(), "Unknown error " + errorResponse.code(), Snackbar.LENGTH_LONG)
.setAction(android.R.string.ok, v -> {})
.show();
}
viewModel.updateLoginButtonState();
}
);
Run Code Online (Sandbox Code Playgroud)
220ms是相当多的(我觉得我注意到片段启动时滞后).
我正在使用RxJava和retrolambda,但这不是弹出此消息的唯一地点,所以我认为它不直接相关.
我如何影响验证时间?它甚至值得吗?
它似乎与圈复杂度有关,因为我可以通过删除一些更干的代码中的Snackbar.make调用来消除警告:if
String errorMessage;
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
errorMessage = getString(R.string.login_bad_credentials);
} else {
errorMessage = …Run Code Online (Sandbox Code Playgroud) 我收到了这条消息gradle:
Instant Run is disabled when Jack compiler is used
Run Code Online (Sandbox Code Playgroud)
我的编译时间太长了.
3:54:11 PM Gradle build finished with 1 warnings(s) in 17m 15s 937ms
Run Code Online (Sandbox Code Playgroud)
我认为是因为这个消息.
我很担心离线模式.
我的朋友:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '24.0.0'
defaultConfig {
applicationId "*.*.*"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
jackOptions {
enabled true
}
// Enabling multidex support.
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dexOptions …Run Code Online (Sandbox Code Playgroud) 我注意到,当我有一个var带有自定义的属性时get,不使用field标识符,无论如何都会生成一个支持字段.我检查了字节码,文档也这样说:
如果属性使用至少一个访问器的默认实现,或者自定义访问者通过字段标识符引用它,则将为该属性生成支持字段.
(重点是我的)
考虑这样的一个类.由于它是var属性,set因此将生成默认值(因此支持字段):
class Banana {
var ripeness = 1
var color: String = "green"
get() = when {
ripeness > 80 -> "brown"
ripeness > 50 -> "yellow"
else -> "green"
}
}
val b = Banana()
b.color = "blue"
println(b.color)
Run Code Online (Sandbox Code Playgroud)
但是,println无论我设置什么,它都将始终打印为"绿色" color.无论如何,支持字段将设置为"蓝色".
由于无法在访问器方法之外(或通过反射)访问它,我真的想不出这个的原因.
我在这里错过了什么吗?也许是用例或其他方式访问支持领域?或者它只是一个错误(或IntelliJ中缺少警告)?
在 Kotlin 中,我们有一个漂亮的特性,比如扩展。甚至可以将更新的自定义方法添加到其对象已被实例化的超类中。该方法可以被代码中创建的对象访问。
我的问题基本上分为两个。
Java 或其他常用的编程语言中是否有此功能的概念?
如果之前的答案是否定的,是否有任何解决方法可以在 Java 或其他语言中实现扩展?
使用PagedList,这里它没有数据库支持,但是CachedDataList内存中有一个数据列表(称为),可以由fetchMore()函数填充。
拥有PositionalDataSource,DataSource.Factory和PagedList.BoundaryCallback,它在这里只是一个问题。
该流程是PositionalDataSource的loadInitial()开始时将被调用,以开始从中加载数据 CachedDataList,然后再调用loadRange()以继续从CachedDataList按页面大小加载数据 。
CachedDataList页面中的所有数据都被分页后,BoundaryCallback::onItemAtEndLoaded()将调用(如果开始时没有后备数据,则将BoundaryCallback::onZeroItemsLoaded()调用),
在那里,它将开始要求fetchMore将更多数据添加到中CachedDataList,并在将新数据添加到其中时,调用DataSource invalidate()以重新启动新的PagedList和DataSource对,然后loadInitial()再次从PositionalDataSource开始。
它是由
observableCachedData.observe(owner, refreshHandler!!)
//??? TODO: how to only listen to newly posted data after
//starting the observe?
//DOC: 'If LiveData already has data set, it will be delivered to the observer.'
// fetchMore
val didFetch = dataRequester.fetchMore() //asyc call
Run Code Online (Sandbox Code Playgroud)
在这里,它观察observableCachedData的变化,如果有变化 onChanged(),则
class RefreshHandler(val observableCachedData: …Run Code Online (Sandbox Code Playgroud) 我发现IllegalArgumentException: Called attach on a child which is not detached什么时候用它mFeedAdapter.notifyItemInserted(0)来改变数据,找到这个。
但解决方案是更改notifyItemInserted为notifyDataSetChanged.
我不想改变功能,因为我想保留动画。我能做什么 ?
将静态共享首选项编辑器放在实用程序类中是一个好主意/实践,这样我可以在需要时调用它吗?实用程序类中的方法如下所示:
public static SharedPreferences.Editor editor (Context context){
final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
return sharedPrefs.edit();
}
Run Code Online (Sandbox Code Playgroud)
并在不同的类中使用它:
Utility.editor(mContext).putBoolean(categoryId, true);
Utility.editor(mContext).apply();
Run Code Online (Sandbox Code Playgroud) 我想在单击事件后调用 RecyclerView.Adapter 中的支持片段管理器,以便移动到不同的片段。我的做法:
(context as MainActivity).supportFragmentManager
.beginTransaction()
.replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
.commit()
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
kotlin.TypeCastException:null 无法转换为非 null 类型
你能帮助我吗?
我们想在我们的 android 应用程序中使用 Google Maps API 和 Places Autocomplete API。在使用之前,我们希望明确您使用这些 API 的“使用条款”。我们检查了谷歌文档。但是我们仍然有一些查询,如下所示:
我们想使用 2 个全屏视图。在第一个视图中,将有一个搜索按钮上方的 OpenStreet 地图。如果用户单击该搜索按钮,将打开第二个视图,其中将有一个搜索栏和空间来显示搜索结果。这里我们想使用 Places Autocomplete API 来搜索地点。以便我们将在此页面中添加“Powered By Google”徽标。
选择结果后,用户将被重定向到第一个视图(地图页面),该位置将在那里显示为标记。您能否确认这是可以接受的,这是在没有 Google 地图的情况下使用 Places API 的正确方法吗?如果没有,请让我知道这样做的正确方法。
如果我们在我们的 android 应用程序中使用谷歌地图,如果我们在地图上显示移动的汽车或卡车是否可以接受?是否有任何付费服务可以使用此功能?
谢谢。
我有一个List,我基本上想拉链,但只有每一秒.
我的意思是:我希望我的名单[a,1,b,2]成为[(a,1),(b,2)],我目前正在使用zipWith.
但它没有给我预期的结果,它给了我[(a,1),(1,b),(b,2)].
我现在是完全愚蠢的,还是除了忽略每一个元组之外没有其他解决方案?(例如,filter之后添加一个)是否没有运营商?
我有一个关于六边形架构和 DDD 的问题
是否允许从作为参数传递给适配器的持久适配器调用域逻辑?
例子:
class DomainService(private val repositoryPort: RepositoryPort,
private val domainService2: DomainService2) {
fun doSomething(id: String?) {
repositoryPort.doSomething(id) {
id: String? ->
domainService2.doSomething2(id)
}
println("Doing something")
}
}
class DomainService2 {
fun doSomething2(id: String?) {
println("Doing something$id")
}
}
interface RepositoryPort {
fun doSomething(id: String?, consumer: (id: String?) -> Unit)
}
class RepositoryAdapter : RepositoryPort {
override fun doSomething(id: String?, consumer: (id: String?) -> Unit) {
println("checking something, searching in database")
consumer.invoke(id) // Is it allow here to …Run Code Online (Sandbox Code Playgroud) 我正在使用mockito进行单元测试.请考虑以下代码段
ThirdPartyClass tpo = mock(ThirdPartyClass.class);
doNothing().when(tpo).someMethod();
Run Code Online (Sandbox Code Playgroud)
ThirdPartyClass我们是来自第三方的罐子tp.jar.现在tp.jar不是一个超级罐子.这是什么ThirdPartyClass样的
class ThirdPartyClass
{
SomeOtherClass memberObject;
public ThirdPartyClass(){}
/*Rest of the code*/
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试运行我的单元测试时,我得到java.lang.ClassNotFoundException了SomeOtherClass.请记住,这tp.jar不是一个超级jar,所以它有意义,SomeOtherClass不在我的类路径中.
但为什么mockito无法处理这种传递依赖?有没有办法忽略所有传递依赖?
android ×7
kotlin ×7
java ×4
google-maps ×1
ios ×1
junit ×1
mockito ×1
pagedlist ×1
performance ×1