【问题标题】:Kotlin generics change return typeKotlin 泛型更改返回类型
【发布时间】:2018-01-29 15:10:49
【问题描述】:

我在 Java 中有这个方法我想转换为 Kotlin,但仍然在 Java 和 Kotlin 中使用:

@Nullable
public static <T extends CharSequence> T nullIfEmpty(@Nullable final T t) {
   return TextUtils.isEmpty(t) ? null : t;
}

在另一个地方我有一个接受字符串的方法:

public static doSomething(@Nullable String foo) {}

我这样称呼:

String foo = "";
doSomething(nullIfEmpty(foo)); // == doSomething(null); since foo is empty

在我将nullIfEmpty() 转换为这个 Kotlin sn-p 之后:

fun <T : CharSequence> nullIfEmpty(t: T?): T? {
    return if (TextUtils.isEmpty(t)) null else t
}

Java 不再编译时抱怨参数类型不匹配 - 当它需要 String 时使用 CharSequence 调用函数。

解决这个问题的正确语法是什么?

【问题讨论】:

  • 顺便说一句,你可以重写nullIfEmpty函数如下:fun &lt;T : CharSequence&gt; nullIfEmpty(t: T?): T? = t.takeUnless { it.isNullOrEmpty() }

标签: generics kotlin nullable


【解决方案1】:

如果您使用的是 Java 8(或更高版本,我想),那么此代码实际上会按照您所展示的那样工作。

在早期版本中(我假设您使用的是 Android?),类型推断较弱,您必须明确指定泛型类型才能使其工作,如下所示:

String foo = "   ";
doSomething(K.<String>nullIfEmpty(foo));

(我已将 Kotlin 函数包装在一个名为 K 的对象中,并使用该限定符调用它,以便可以将类型参数放置在 Java 调用站点。我认为您无法提供带有静态导入的类型参数。)


旁注:注意这是TextUtils.isEmpty()的实现,所以它不会为" "这样的字符串返回true

/**
 * Returns true if the string is null or 0-length.
 * @param str the string to be examined
 * @return true if str is null or zero length
 */
public static boolean isEmpty(@Nullable CharSequence str) {
    return str == null || str.length() == 0;
}

【讨论】:

  • 谢谢!不幸的是,这使得从 Java 7 调用该方法变得更加冗长,但我想我们可以更新到 Java 8(刚刚尝试过,它可以工作)。我还修复了我的示例 - 不知道为什么我写了一个空字符串,而我的意思是一个空字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多