가장 작은 널이 될 수 있는 타입은 Nothing?이다. 이 타입은 널 상수 이외의 어떤 값도 포함하지 않는다. 이 타입은 null 값 자체의 타입이며 다른 모든 널이 될 수 있는 타입의 하위 타입이다. 가장 큰 널이 될 수 있는 타입은 Any?이다. Any?는 코틀린 타입 시스템 전체에서 가장 큰 타입으로, 널이 될 수 있는 모든 타입과 널이 될 수 없는 모든 타입의 상위 타입이다.
널이 될 수 있는 타입은 원래 타입(널이 될 수 있는 타입에 해당하는 널이 될 수 없는 타입)에 들어있는 어떤 프로퍼티나 메서드도 제공하지 않는다. 멤버 함수를 호출하거나 프로퍼티를 읽는 등의 일반적인 연산이 null에서는 의미가 없기 때문이다. isLetterString() 함수의 파라미터 타입을 String?으로 바꾸되, 나머지 부분을 모두 그대로 두면 함수 본문의 모든 s 사용법이 잘못됐다고 컴파일 오류가 발생한다.
fun isLetterString(s: String?): Boolean { // error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? if (s.isEmpty()) return false // error: not nullable value required to call an 'iterator()' method on for-loop range for (ch in s) { if (!ch.isLetter()) return false } return true }