2009-06-15 3 views
8

스칼라 제네릭의 구현에 대한 궁금한 점이 있습니다. 스칼라에서스칼라 제네릭과 C#

class Foo<T1>{} 
class Foo<T1, T2>{} 

그러나 같은 일이 클래스 이름이 여러 제네릭 매개 변수에 대한 변경을 강요하는 방법을

class Foo0[T1]{} 
class Foo1[T1, T2]{} 

주의로 선언 할 것이다 :로 C#에서 하나의 클래스를 선언 할 수 있습니다. 스칼라가 더 우아하다고 느끼는 C# 하나가 아닌이 길로 가기로 결정한 이유가 있습니까? 나는 이것이 아마 아주 작은 nitpick 인 것을 알고있다. 그러나 나는 추리에 관해서는 꽤 흥미 롭다.

+0

스컬라에서는'{}'는 필요하지 않습니다. –

답변

24

나는 존 소총의 대답이 받아 들여졌다 알지만, 그것은 아주 옳지 않아. Java 언어이므로 제한을 가하는 것은 JVM이 아닙니다. 스칼라는 Java에서 가능한 한 쉽게 호출 할 수 있다는 디자인 목표를 가지고 있으며 Java는 형식 매개 변수를 기반으로 클래스 이름을 오버로드하는 개념이 없습니다. 예를 들어, JVM에서 유형 매개 변수를 기반으로하는 과부하를 구현하는 간단한 방법은 이름 맹 글링을 사용하는 것입니다. 그러나 그 이름 맹 글링은 Java에서 볼 수 있어야하고 추악 할 것입니다. 귀하의 예제에서 가상의 Scala는 Foo_ $ 1과 Foo_ $ 2의 두 클래스를 컴파일 할 수 있습니다. 스칼라가 그 mangling을 보이지 않게 할 수있다. 그러나 Java 프로그래머는 모든 추한 것을 보게됩니다.

+3

나는 이것이 C#이 어쨌든하는 일이라고 확신한다. Foo 의 타입 이름은 Foo'1입니다. –

4

그것은 잘 자바의 유사한 제한을 부분적으로 할 수있다. 필자가 이해 하듯이 스칼라는 이고 대부분은으로 JVM에서 사용됩니다. 여기서는 일반적인 유형을 과부하로 사용할 수 없습니다.

그것은 심지어 .NET 포트에 너무 자사의 제네릭에 대한 Scala uses type erasure 것 같습니다. (같은 기사에서 스칼라가 자바가 실제로 나오기 훨씬 전에 스칼라가 제네릭을 가지고 있다고 언급했기 때문에 을 지원한다고해도 스칼라가 처음에는 기능을 설계 할 때 다소 제한적이었다.)

+0

JVM에 대한 변경을 피하기 위해 지우개를 그냥 영리한 (다소간) 해킹하지 않았습니까? 그렇다면 스칼라는 런타임시 제네릭을 지원하기 위해 JVM과 동일한 변경을 요구하지 않을까요? 나는 스칼라가 자바보다 자바보다 훨씬 좋지 않다고 생각한다. – Joey

+0

각 인스턴스에 숨겨진 필드 또는 일부 유형 정보를 추가하지 않는 한 그렇게됩니다. "적절한"제네릭과 같은 것을 제 기능을 지원하지 않는 런타임에 추가하는 것은 확실히 어렵습니다. –

+4

스칼라 제네릭은 .NET과 달리 더 높은 종류 일 수 있습니다. 지우지 않고 .NET에 추가하는 방법을 알지 못합니다. –

2

동일한 제한이있는 Java 로의보다 쉬운 맵핑을 위해 수행됩니다.

몇 가지 이름 맹 글링을 할 수 있었지만 더 어려운 자바와 상호 운용을 만드는 가격 것입니다. 내 견해로 그들은 올바른 결정을 내렸다.

관련 문제