제네릭을 _잘_ 구현하는 언어가 있나요?
-
09-06-2019 - |
문제
나는에서의 토론을 좋아했다 제네릭의 차이점, 이 기능을 특히 잘 사용하는 언어가 있는지 궁금했습니다.
나는 자바를 정말 싫어한다. List<? extends Foo>
한 동안 List
Liskov로 대체 가능한 것들 Foo
.왜 할 수 없습니까? List<Foo>
그거 덮어?
그리고 솔직히, Comparable<? super Bar>
?
또한 제네릭 배열을 반환해서는 안되는 이유를 평생 기억하지 못합니다.
public T[] getAll<T>() { ... }
나는 C++의 템플릿을 결코 좋아하지 않았지만 그 이유는 컴파일러 중 어느 것도 원격으로 의미 있는 오류 메시지를 내보낼 수 없었기 때문이었습니다.한번은 내가 실제로 한 일을 make realclean && make
컴파일할 내용을 얻기 위해 17번;나는 왜 17번째 시간이 매력인지 결코 알지 못했습니다.
그럼 실제로는 누가 좋아한다 애완 동물 언어로 제네릭을 사용합니까?
해결책
Haskell은 유형 생성자 매개변수화(제네릭 또는 매개변수 다형성)를 매우 잘 구현합니다.Scala도 마찬가지입니다(때로는 약간의 손이 필요할 때도 있지만).
이 두 언어 모두 상위 종류 유형(a.k.a.추상 유형 생성자 또는 유형 생성자 다형성 또는 고차 다형성).
여기를 보아라: 더 높은 종류의 제네릭
다른 팁
나는 Java의 제네릭이 실제로 꽤 좋다고 생각합니다.이유는 List<Foo>
와는 다르다 List<? extends Foo>
그때인가? Foo
의 하위 유형입니다. Bar
, List<Foo>
의 하위 유형이 아닙니다. List<Bar>
.치료할 수 있다면 List<Foo>
객체로 List<Bar>
, 그런 다음 추가할 수 있습니다. Bar
이에 반대하면 문제가 발생할 수 있습니다.합리적인 유형 시스템에는 이것이 필요합니다.Java를 사용하면 치료를 피할 수 있습니다. Foo[]
하위 유형으로 Bar[]
, 그러나 이로 인해 런타임 검사가 강제 실행되어 성능이 저하됩니다.이러한 배열을 반환하면 컴파일러가 런타임 검사를 수행할지 여부를 알기가 어렵습니다.
하한값을 사용할 필요가 전혀 없습니다(List<? super Foo>
), 그러나 일반적인 값을 반환하는 데 유용할 수 있다고 생각합니다.보다 공분산과 반공분산.
하지만 전반적으로 나는 지나치게 장황한 구문과 혼란스러운 오류 메시지에 대한 불만에 확실히 동의합니다.OCaml 및 Haskell과 같은 유형 추론 기능이 있는 언어를 사용하면 오류 메시지도 혼란스러울 수 있지만 이 작업이 더 쉬워질 것입니다.
도대체 영어는 제네릭도 잘 구현하지 않습니다.:)
내 편견은 C#입니다.주로 그것이 내가 현재 사용하고 있는 것이고 나는 그것들을 좋은 효과로 사용했기 때문입니다.
목록에 OCaml을 추가하겠습니다. 일반적인 제네릭.나는 Haskell의 유형 클래스가 정말 잘 수행되었다는 점에 동의합니다. 그러나 Haskell에는 OO 의미 체계가 없지만 OCaml은 OO를 지원한다는 점에서 약간 다릅니다.
저는 .Net(VB.Net)을 사용하고 있으며 제네릭을 사용하는 데 아무런 문제가 없습니다.대부분 통증이 없습니다.
Dim Cars as List(Of Car)
Dim Car as Car
For Each Car in Cars
...
Next
제네릭 컬렉션을 사용하는 데 아무런 문제가 없었지만 제네릭을 사용하는 개체를 직접 디자인한 적은 없습니다.
제 생각에는 C#과 VB.NET이 제네릭 작업에 적합하다고 생각합니다.