2017-04-17 4 views
0

내가 <code>[Integer]</code>이 유형의 매개 변수 스칼라에서 작업하는</p> <pre><code>mod.f_.f[Integer](1) </code></pre> <p>뭔가를 기대 자바 (또는 스칼라)에서 형식 매개 변수

shared T f<T>(T t){ 
    return t; 
} 

로와 실론 최상위 함수를 호출. 그러나 형식 매개 변수를 허용하지 않습니다.

왜 스칼라 내가 스칼라 함수를 노출하는 컴파일러에게 충분히 할 정수 (정수) 예상

shared Integer(Integer) fi = f<Integer>; 

대신 함수의 게터를 참조 않습니다.

f_.f(Integer.$TypeDescriptor$, Integer.instance(1)) 

나 :

f_.<Integer>f(Integer.$TypeDescriptor$, Integer.instance(1)) 

실론 기능

답변

-1

실론 실제로 형 안전의 요구 사항을 충족하고 안전한 방법으로 null 값을 처리하도록되어 :

은 여기 f 기능을 호출하는 자바 클래스 G와 전체, 작업 예입니다. 그러나 런타임에는 그렇지 않습니다.

그래서, 질문에 아주 간단한 대답이있다 :

scala> mod.f_.f(null,3). 

그게 정말 재미.

은 물론, 재미를 더 많은 방법이 있습니다 :

scala> implicit def f(x:Any):com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor = com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.klass(x.getClass) 

scala> mod.f_.f(List(),3) 
scala> mod.f_.f(List,3) 
scala> mod.f_.f(Float,3) 
... 
+1

실론이 더 안전하게 여기에서 null을 처리 할 것이라고 어떻게 생각하십니까? Ceylon의 유형 시스템은 컴파일 타임에 적용되며 실론 외부에서 실론 함수에 액세스 할 때 런타임에는 적용되지 않습니다. –

+0

안전한 방법으로 사용자가 여기에서 null을 어떻게 처리 할 것으로 예상합니까? 예 : 프로그래밍 방식으로! – Michael

8

내가 스칼라을 모르는, 그래서 나는 단지 여기에 자바 부분 도울 수 있지만, 당신은 자바에서 해당 함수를 호출하는 방법은 정규화 된 제네릭이므로 형식 매개 변수는 일반 매개 변수로 바뀌고 형식 인수의 형식 설명자 개체를 제공해야합니다. 실론 클래스와 인터페이스에는 고정 된 $TypeDescriptor$ 회원이 있습니다. 나는 다른 것들 (자바 클래스, 유니온 및 교차 타입, ...)이 내 머리 꼭대기에서 어떻게 작동 하는지를 모르지만 Ceylon에서 이와 동등한 호출을 작성하고 --verbose=code으로 컴파일하여 생성 된 Java 코드를 살펴볼 수있다. gist

+3

당신은 Java 또는 스칼라 클래스'에 대한'TypeDescriptor'를 얻기 위해''TypeDescriptor.klass (Whatever.class)를 사용할 수 있습니다 @Michael을 무엇이든 '. –