강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của boki
boki

câu hỏi đã được viết

Kotlin Nâng cao

Bài học 5. Các ràng buộc chung và các hàm chung

Generic Func 질문이 있습니다

Đã giải quyết

Viết

·

98

·

Đã chỉnh sửa

1

강사님 Generic Func에서

// origin
fun <T> List<T>.hasIntersection(other: List<T>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

// error
fun <T> List<T: Any>.hasIntersection(other: List<T>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

// error
fun <T> List<T>.hasIntersection(other: List<T : Any>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

// error
fun <T> List<T: Any>.hasIntersection(other: List<T : Any>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

// ok
fun <T : Any> List<T>.hasIntersection(other: List<T>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

이렇게 되더라구요! 맨 앞에 <T>가 반환타입(List<T>)과 인자타입(other: List<T>) 까지 함께 선언해주는 declaration-site variance의 형태를 띄고 있어서 그런건가요?

생각해보면 들어갈 수 있는 타입은 nullable인데 반환타입은 not null이거나 그 반대가 되면 헷갈릴 것 같아요. 그것을 막아둔것같기도 하구요!

이렇게 제네릭 메서드를 만드는 경우에도 generic 제약을 줄 수 있는거죠!?

좀 더 실 사용에 가깝게 타입가드까지 하려면

fun <T : Number> List<T>.hasIntersection2(other: List<T>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

이런 느낌으로 쓰일것같은데.. 맞나요?

 

코틀린 고급편 잘 듣고있습니다 ~_~

kotlin함수형-프로그래밍객체지향

Câu trả lời 1

1

lannstark님의 프로필 이미지
lannstark
Người chia sẻ kiến thức

안녕하세요 보키님! 🙂 말씀해주신 2번째 / 4번째 코드에서 에러가 발생하는 이유는

T에 대한 제약을 가할 수 있는 fun <T> <-- 여기: Any 와 같은 제약을 가한게 아니라

실제 T 타입을 사용해야 하는 List<T>.functionName() 이나 parameter: List<T> 에서 제약을 가하려 하셨기 때문입니다! 🥺 문법 적인 오류로 봐주시면 될 것 같아요!

 

fun <T : Any> List<T>.hasIntersection(other: List<T>): Boolean {
    return (this.toSet() intersect other.toSet()).isNotEmpty()
}

라고만 하시더라도 앞에 사용된 List<T> 에는 Any의 하위 타입이 들어와 하고, other: List<T> 에도 Any의 하위 타입이 들어와야 한답니다!

"생각해보면 들어갈 수 있는 타입은 nullable인데 반환타입은 not null이거나 그 반대가 되면 헷갈릴 것 같아요. 그것을 막아둔것같기도 하구요!" 라고 생각해주시는 부분도 일리가 있고~ 제약 자체를 fun 과 수신객체 타입 사이에서만 할 수 있다고 이해해 주셔도 좋을 것 같아요!

넵! 보내주신 hasIntersection2 처럼 사용한다고 봐주시면 될 것 같습니다! (Number 타입의 List만 만드는 경우는 드물고 보통은 단순 T 타입으로만 많이 처리하는 것 같아요, 물론 숫자 연산이 필요하면 Number 제약을 줄 수도 있습니다)

 

아이고~ 잘 들어주셔서 감사합니다. 강의 들으시다가 또 궁금한 점 생기시면 질문 남겨주세요! 🙇

 

p.s.

앗 아쉽네요~!! 🥺 🥺 다음에 뵐 수 있는 기회.. 기다려 보겠습니다.. 🍁

Hình ảnh hồ sơ của boki
boki

câu hỏi đã được viết

Đặt câu hỏi