문제

나는에서의 토론을 좋아했다 제네릭의 차이점, 이 기능을 특히 잘 사용하는 언어가 있는지 궁금했습니다.

나는 자바를 정말 싫어한다. 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이 제네릭 작업에 적합하다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top