문의1) interface Array<T> { forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; } 위 인터페이스를 보고 호출값을 객체값 또는 문자형이 아닌 배열형 [ 1, 2, 3 ] 으로 호출을 하고 있는데요. 어디에서 힌트를 얻어 배열형으로 호출을 하신건지 궁금합니다. 문의2) 만약 아래와 같이 되어 있어도 배열형으로 호출을 해도 되는지 궁금합니다. interface Test<T> { aa(callbackfn: (value: T, index: number ) => void ): void; } 문의3) 만약 바로 위 Test 인터페이스에 대해 배열로만 제한을 하고 T 타입에 대해 호출하는 순간의 타입으로 제한하고자 한다면 어떻게 정의를 해줘야 할까요?
불변 객체는 내부 필드에 변경이 생길 경우 새로운 객체를 반환해줘야 한다고 배웠습니다. 제네릭 타입은 타입 소거 문제 때문에 new 키워드를 사용할 수 없는데... 이 경우 제네릭과 불변 객체는 공존할 수 없는 건가요? 아래 코드와 같이 실습을 해봤는데 주석 처리한 부분을 어떻게 해결해야 할지 잘 모르겠습니다 ㅠㅠ public class Box<T extends Animal> { private final T value; public Box(T value) { this.value = value; } public T get() { return value; } public Box<T> withName(String name) { //이 부분을 어떻게 처리해야할까요..? } } public class Animal { private final String name; private final int size; public Animal(String name, int size) { this.name = name; this.size = size; } public Animal withName(String name) { return new Animal(name, size); } public class Dog extends Animal { public Dog(String name, int size) { super(name, size); } @Override public Dog withName(String name) { return new Dog(name, getSize()); } }
안녕하세요! 이번에 정처기 문제에서 타입 이레이저 관련 문제가 나왔는데, 궁금한 점이 생겨서 질문 올려봅니다. class Printer { void print(Integer a) { System.out.print("A" + a); } void print(Object a) { System.out.print("B" + a); } void print(Number a) { System.out.print("C" + a); } } public class Gisafirst { public static void main(String[] args) { new Container<>(0).print(); } public static class Container<T> { T value; public Container(T t) { value = t; } public void print() { new Printer().print(value); } } } 제가 이해한 바로는, 강의에서 설명해주신대로 new Container<>(0) 에서 public static class Container<Integer> { Integer value; public Container(Integer t) { value = t; } public void print() { new Printer().print(value); } } 컴파일러가 컴파일 시점에 이렇게 이해하고 나서 컴파일 종료 후, 타입 소거가 일어나서, Object로 변환한다고 이해했습니다. 그래서 print 메서드를 호출할 때 value는 Object 타입이므로 B0가 출력되는 것이죠. 여기서 궁금한 점은 바로 print의 오버로딩 메서드 선택 시점입니다. 제가 찾아본 바로는 오버로딩 메서드 선택시점은 컴파일 단계에서 이루어진다로 알고있습니다. 그렇다면 동작방식이 컴파일 종료 후 타입 소거가 일어나는게 아니라, 정확히는 "컴파일 시작 - 타입 소거 - 오버로딩 메서드 선택 - 컴파일 종료 - 런타임" 이런식으로 일어나는건가용? 아니면 어디서 오해하고 있는지 궁금합니다!
function add<T extends (a: string) => number>(x: T): T { return x }; add((a)=>+a) 위 코드 add((a)=>+a) 에서 인자 a가 왜 string으로 인식되는지 , +a가 왜 숫자로 인식되는지 이해가 가지 않습니다.
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
안녕하세요. part1 람다식 강의 16:18 에서 50번째 줄 에 있는 new Myfunc<Item, bool> 을 지우셨는데 궁금증이 생겨 질문드립니다. 14:40 에서 50번째 줄 에 있는 것처럼 제네릭이 없는 델리게이트를 사용할 때는 ItemSelector selector = new ItemSelector ((Item Item) => { return item.ItemType == ItemType.Weapon}); new키워드를 쓰셨는데 16:18 에서 제네릭을 사용하시고부터는 없어도 똑같이 동작한다고 말씀하셨습니다. 즉 코드상으로 MyFunc<Item, bool> selector = new MyFunc<Item, bool> ((Item Item) => { return item.ItemType == ItemType.Weapon}); 에서 MyFunc<Item, bool> selector = (Item Item) => { return item.ItemType == ItemType.Weapon}; 로 고치셨습니다. new Myfunc<Item, bool> 를 지우셨는데 제네릭을 사용할 때는 new 를 써도 되고 안써도 되고라고 이해해도 될까요?
안녕하세요, 제네릭 강의 부분에 '정의된 타입으로 타입을 제한하기' 강의에서 여쭤보고 싶은게 생겨 질문 드립니다. logTextLength(10); 에서 에러가 출력되는 이유가 궁금합니다. 수업과 핸드북 내용(https://joshua1988.github.io/ts/guide/generics.html#%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4)을 참조했을 때, 에러가 발생하는 이유는 logTextLength함수의 전달인자인 10인 숫자 타입에는 length 속성이 없기 때문이라고 하셨는데요, 그런데 수업 중 'T extends LengthType'으로 T 타입은 LengthType 내에 있는 모든 속성들을 갖고 있게 된다고 하셔서, logTextLength(10) 의 10이라는 숫자 타입에도 LengthType의 속성인 length를 갖게 된다고 생각했었습니다. 그런데 logTextLength(10) 이 에러를 출력하는 이유로, 10에 length 속성이 없기 때문이라고 하신 부분이 이해가 잘 안가 문의드립니다.