Kotlin 泛型更改 return 类型

Kotlin generics change return type

我在 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 片段之后:

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

Java 不再编译时抱怨存在参数类型不匹配 - 在需要 String.

时使用 CharSequence 调用函数

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

如果您使用的是 Java 8(或更高版本,我想),此代码实际上会像您提供的那样工作。

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

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

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


旁注:请注意,这是 TextUtils.isEmpty() 的实现,因此对于 " ".

这样的字符串,它不会 return 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;
}