Generics 可为空的运算符在泛型类中有效吗?

Generics 可为空的运算符在泛型类中有效吗?,generics,nullable,kotlin,Generics,Nullable,Kotlin,Kotlin具有处理可空类型的漂亮特性(?。和!!。)。但这一个正好打动了我--如果您不知道您正在处理的是可为null的类型还是不可为null的类型呢?如果您有泛型类MyClass,那么您只有一些类型T,就是这样 Kotlin是否允许将“nullable”运算符应用于泛型类型(T),该类型是否可以在类内设置为nullable(如T?),如果该类将被实例化为nullable类型(如MyClass)。它会导致可空的空值(如C++中指针的指针-- **STD::String )类型在 MyClass

Kotlin具有处理可空类型的漂亮特性(
?。
!!。
)。但这一个正好打动了我--如果您不知道您正在处理的是可为null的类型还是不可为null的类型呢?如果您有泛型类
MyClass
,那么您只有一些类型
T
,就是这样

Kotlin是否允许将“nullable”运算符应用于泛型类型(
T
),该类型是否可以在类内设置为nullable(如
T?
),如果该类将被实例化为nullable类型(如
MyClass
)。它会导致可空的空值(如C++中指针的指针--<代码> **STD::String )类型在<代码> MyClass < /C> >类型>

< P>我刚才在.</P>中尝试过。
它现在甚至不编译,因为我们不能用
String?
实例化
t:Any
。调用
x?.toString()
也被标记为警告,表示不需要安全调用。

哇,如果可以的话,我会为该链接添加更多点:-)非常感谢。更重要的是,您刚刚发现显式反对null实际上不起作用。如果没有泛型,您将不得不编写
!!。toString()
但对于泛型,编译器不知道什么是
T
,并允许隐式检查。在第二次检查中,此示例是特例,因为
toString
是在根类型中定义的。这就是为什么(可能)它首先要编译的原因——任何其他方法,如
length
都需要向泛型添加约束,这意味着您必须事先决定编写泛型类的类型——是否为null。您是对的。如果我将T设置为扩展任何类型,我就不能将它绑定到可为null的类型,因为T?不扩展t。这里有一个不编译的示例:just type
t
被解释为
t:Any?
,因此没有“just type
t
”,因为编译器将其视为可空。您可以使用
T:Any
定义不同的不可为null的上界。just type
T
被解释为
T:Any?
,因此不存在“just type
T
”,因为编译器会将其视为可为null。您可以使用
T:Any
定义不可为空的不同上界。
class MyClass<T>(val x: T) {
  fun foo() {
    println(x.toString())
  }

  fun fooSave() {
    println(x?.toString())
  }

}

fun main(args: Array<String>) {
  MyClass<String?>(null).fooSave()
  MyClass<String?>(null).foo()
}
class MyClass<T : Any>(val x: T) {
  fun foo() {
    println(x.toString())
  }

  fun fooSave() {
    println(x?.toString())
  }

}

fun main(args: Array<String>) {
  MyClass<String?>(null).fooSave()
  MyClass<String?>(null).foo()
}