2008-09-08 5 views
7

나는 Differences in Generics에서 토론을 좋아했으며이 기능을 특히 잘 사용하는 언어가 있는지 궁금해하고있었습니다.제네릭 _well_을 구현하는 언어가 있습니까?

나는 Foo에 대해 Liskov-substitutable 인 것들 중 List에 대해 Java의 List<? extends Foo>을 정말로 좋아하지 않습니다. 왜 List<Foo>은 그것을 커버 할 수 없습니까?

솔직히 말하면, Comparable<? super Bar>?

당신은 제네릭의 배열 결코 반환해야하는 이유를 나는 또한 내의 생명에 대한 기억이 안나요

: C++에서 나는 결코 좋아 템플릿

public T[] getAll<T>() { ... } 

을하지만이었다 대부분 컴파일러 누구도 할 수 있기 때문에 그 (것)들을위한 먼 의미심장 한 착오 알림말을 밖으로 뱉으십시오. 한 번은 실제로 컴파일 할 무언가를 얻기 위해 17 번이나 make realclean && make 번을했습니다. 나는 왜 17 번째 시간이 매력인지 결코 알지 못했다.

그래서 실제로 은 애완 동물 언어로 제네릭을 사용하여을 좋아합니까?

+0

커뮤니티 위키 여야합니다. –

+0

나에게 좋은 소리 :) –

답변

14

하스켈은 type-constructor 매개 변수화 (generics 또는 parametric polymorphism)를 잘 구현합니다. 스칼라도 그렇다. (때로는 약간의 손을 잡아야한다.)

이 두 언어 모두 더 높은 유형의 유형 (예 : 추상 유형 생성자 또는 유형 생성자 다형성 또는 고차 다형성)을 갖습니다.

는 여기를 참조하십시오 : Generics of a Higher Kind

7

지옥, 영어도 잘 제네릭을 구현하지 않습니다. :)

내 편견은 C#입니다. 주로 그것이 내가 현재 사용하고있는 것이기 때문에 나는 그것들을 좋은 효과로 사용했다.

1

.Net (VB.Net)을 사용하며 제네릭 사용에 문제가 없었습니다. 거의 고통스럽지 않습니다. 내가 지금까지 내 자신에 제네릭을 사용하는 모든 객체를 설계하기로 사라하지 않은 있지만

Dim Cars as List(Of Car) 
Dim Car as Car 

For Each Car in Cars 
... 
Next 

는 일반 컬렉션 제품을 사용하면서 문제가 없었어요.

7

자바의 제네릭이 실제로 꽤 좋다고 생각합니다. List<Foo>List<? extends Foo>과 다른 이유는 FooBar의 하위 유형 인 경우 List<Foo>List<Bar>의 하위 유형이 아니기 때문입니다. List<Foo> 오브젝트를 List<Bar>으로 처리 할 수 ​​있다면 Bar 오브젝트를 추가하여 오브젝트를 손상시킬 수 있습니다. 어떤 합리적인 유형의 시스템이 필요합니다. 자바를 사용하면 Foo[]을 하위 유형 Bar[]으로 처리 할 수 ​​있지만 런타임 검사를 강제하므로 성능이 저하됩니다. 이러한 배열을 반환하면 컴파일러가 런타임 검사를 수행할지 여부를 알 수 없게됩니다.

나는 아래 경계 (List<? super Foo>)를 사용할 필요가 전혀 없지만 일반적인 값을 반환하는 데 유용 할 것이라고 생각합니다. covariance and contravariance을 참조하십시오.

지나치게 자세한 구문과 혼란스러운 오류 메시지에 대한 불만에 전체적으로 동의합니다.OCaml과 Haskell과 같은 타입 유추가있는 언어는 에러 메시지가 혼란 스러울 수도 있지만, 아마도 당신을 더 쉽게 만들 것입니다.

+0

나는 대부분 당신과 동의하지만, 포인트 소거가 두 가지있다 : 때로는 통증이있을 수 있으며, generics에서 원시 타입을 사용할 수 없다. –

3

OCaml을 목록에 추가합니다. 실제로는 generic generics입니다. 나는 하스켈의 타입 클래스가 실제로 잘되었다는 것에 동의하지만 하스켈은 OO 의미론을 가지고 있지 않다는 점에서 약간 다르지만 OCaml은 OO를 지원한다.

0

저는 C#과 VB.NET이 제네릭을 잘 처리한다고 생각합니다.

관련 문제