본문 바로가기

Development/Programming

[Scala] Lower Type Bounds

아래의 예시를 보면 LinkedList를 구현하였다. 하지만 ListNode[String]이라고 선언하면 ListNode[Object]를 사용할 수 없게 되는 상황이 나온다.


  1. case class ListNode[T](h: T, t: ListNode[T]) {
  2. def head: T = h
  3. def tail: ListNode[T] = t
  4. def prepend(elem: T): ListNode[T] =
  5. ListNode(elem, this)
  6. }


조금 더 규칙을 허술하게 하고 싶을때 ?? 사용하면 좋다. prepend 함수에 [U >: T] 라고 해주면


  1. case class ListNode[+T](h: T, t: ListNode[T]) {
  2. def head: T = h
  3. def tail: ListNode[T] = t
  4. def prepend[U >: T](elem: U): ListNode[U] =
  5. ListNode(elem, this)
  6. }


아래와 같이 유연하게?? 사용이 가능해진다.


  1. object LowerBoundTest extends App {
  2. val empty: ListNode[Null] = ListNode(null, null)
  3. val strList: ListNode[String] = empty.prepend("hello")
  4. .prepend("world")
  5. val anyList: ListNode[Any] = strList.prepend(12345)
  6. }


'Development > Programming' 카테고리의 다른 글

[Scala] Local Type Inference  (0) 2015.03.17
[Scala] Explicitly Typed Self References  (0) 2015.03.16
[Scala] Upper Type Bounds  (0) 2015.03.11
[Scala] Traits  (0) 2015.03.07
[Scala] Polymorphic Methods  (0) 2015.03.05