小编bit*_*ale的帖子

Kotlin不可空的值可以为null吗?

我有后端给我一些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中,不可空的值可以为空?

gson kotlin kotlin-null-safety

12
推荐指数
1
解决办法
3287
查看次数

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)

怎么可能,定义体的方法是抽象的?

interface abstract kotlin

2
推荐指数
1
解决办法
2444
查看次数

Android gradle.properties中的manifestPlaceholders

我想在链接单击时打开一个活动(显示带有应用程序名称的操作选择器)。一切正常,操作选择器显示在我的应用程序中,但前提是我不在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)

android build manifest gradle

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