Skip to content

Latest commit

ย 

History

History
73 lines (58 loc) ยท 2.67 KB

File metadata and controls

73 lines (58 loc) ยท 2.67 KB

Generic

Kotlin

Star Projection

  1. *์™€ Any?๋Š” ๋‹ค๋ฅด๋‹ค. ์™œ๋ƒ๋ฉด, MutableList๋Š” T์— ๋Œ€ํ•ด ๋ฌด๊ณต๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ.

MutableList<Any?>๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์›์†Œ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ๋ฐ˜๋ฉด,

MutableList<*>์€ ์–ด๋–ค ํƒ€์ž…์ด๋ผ๋„ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์ด ๊ฒฐ์ •๋˜๋Š” ๊ณผ์ •์ด ์ง„ํ–‰๋˜๊ณ , ์ผ๋‹จ ํƒ€์ž…์ด ๊ฒฐ์ •๋˜๋ฉด ๊ทธ ํƒ€์ž…(๊ณผ ํ•˜์œ„ ํƒ€์ž…)์˜ ์›์†Œ๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์ด ๊ฒฐ์ •๋œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•˜๋‹ค.

  1. *์™€ ์ž๋ฐ”์˜ ?๋Š” ๋‹ค๋ฅด๋‹ค.
MutableList<*>  == MutableList<?>

bounded wildcard๋Š” ์‚ฌ์‹ค in/out์— ๋Œ€์‘๋˜๊ธฐ ๋•Œ๋ฌธ์—, unbounded๋งŒ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

interface Function(in T, out U> {
    . . .
}
fun foo(bar: Function<*, *>) {
    // == bar: Function<in Nothing, out Any?>
}

in์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ์ธ์ž๋ฅผ *๋กœ ๋ฐ›์œผ๋ฉด in Nothing์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. out์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ์ธ์ž๋ฅผ *๋กœ ๋ฐ›์œผ๋ฉด out Any?์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ *๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ T, U์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค.

class VarianceTest<in T, out U>(conT: T, conU: U) {
//    val propT: T = conT
//    type parameter T is declared as 'in' but occurs in 'out' position in type T
    val propU: U = conU

//    fun printAll(t: T, u: U)
//    type parameter U is declared as 'out' but occurs in 'in' position in type U
    fun printAll(t: T) {
        print(t)
    }
}

fun starTestFunc(v: VarianceTest<*, *>) {
//    v.printAll(1)
//    Out-projected type 'VarianceTest<*, *>' prohibits the use of 'public final fun printAll(t: T): Unit defined in VarianceTest'
//    type hinting๋„ ์•„์˜ˆ v.printAll(t: Nothing)์œผ๋กœ *์žกํžŒ๋‹ค*.
    print(v.propU)    // out์€ out Any?๊ฐ€ ๋˜๋‹ˆ๊นŒ Any?์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š”๊ฑด ์ž˜ ๋œ๋‹ค.
}

Java

Type Variance and Wildcard

java-wildcard-subtyping ์ž๋ฐ”์—์„œ ?์™€ T๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์ธ์ž๋“ค๊ณผ ๋ฆฌํ„ดํƒ€์ž…์ด ์„œ๋กœ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ์œผ๋ฉด T, ์•„๋‹ˆ๋ฉด ?๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์กฐ๊ธˆ ๋” ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค

๋‚ด๋ถ€์—์„œ ํƒ€์ž…์„ ์ด์šฉํ•œ ์ž‘์—…์„ ํ•  ๋•Œ๋Š” T๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ?๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค ์˜ˆ๋ฅผ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด list์˜ ๊ธฐ๋Šฅ๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  list๋‚ด๋ถ€์˜ ์›์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด๋‹ค

// bad
public <T> boolean isEmpty(List<T> list) {
    return list.size() == 0;
}

// good
public boolean isEmpty(List<?> list) {
    return list.size() == 0;
}

https://medium.com/@joongwon/java-java%EC%9D%98-generics-604b562530b3