我有后端给我一些json.
我把它解析给我的班级:
class SomeData(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String)
Run Code Online (Sandbox Code Playgroud)
使用gson转换器工厂:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud)
在我的界面:
interface MyAPI {
@GET("get_data")
Observable<List<SomeData>> getSomeData();
}
Run Code Online (Sandbox Code Playgroud)
然后我从服务器(使用rxJava)检索数据,没有任何错误.但我期待一个错误,因为我认为我应该做这样的事情(以防止GSON转换器错误,因为notNullableValue
我的JSON响应中不存在):
class SomeData @JvmOverloads constructor(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String = "")
Run Code Online (Sandbox Code Playgroud)
从后端接收数据并使用没有def值的构造函数解析到我的SomeData类之后,notNullableValue的值== null.
据我所知,在Kotlin中,不可空的值可以为空?
如上面所提到这里:如果在一个接口函数没有身体它是默认的抽象.但是界面的功能与身体没有任何关系.
例:
interface MyInterface {
fun foo() { print("Something") }
fun bar()
}
fun main(args: Array<String>) {
println(MyInterface::foo.javaMethod)
println(MyInterface::bar.javaMethod)
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
public abstract void MyInterface.foo()
public abstract void MyInterface.bar()
Run Code Online (Sandbox Code Playgroud)
怎么可能,定义体的方法是抽象的?
我想在链接单击时打开一个活动(显示带有应用程序名称的操作选择器)。一切正常,操作选择器显示在我的应用程序中,但前提是我不在manifestPlaceholder中使用属性名称,否则默认浏览器将打开(没有任何错误)。
我在 gradle.properties 文件中有这一行:
HOST_NAME_DEV="dev.mysite.com"
HOST_NAME_PROD="mysite.com"
Run Code Online (Sandbox Code Playgroud)
我想创建一个像这样的manifestPlaceholder:
// in manifest
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="${host}"
android:scheme="https" />
</intent-filter>
//in build.gradle
productFlavors {
production {
manifestPlaceholders = [host: HOST_NAME_PROD]
}
develop {
manifestPlaceholders = [host: HOST_NAME_DEV]
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
但是如果我将字符串粘贴到manifestPlaceholder中,一切正常:
productFlavors {
production {
manifestPlaceholders = [host: "mysite.com"]
}
develop {
manifestPlaceholders = [host: "dev.mysite.com"]
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,一切也都可以正常工作:
productFlavors {
production {
resValue "string", "host", HOST_NAME_PROD
}
develop {
resValue "string", "host", HOST_NAME_DEV …
Run Code Online (Sandbox Code Playgroud)