2011-12-28 7 views
6

내가 클래스가 말 :기본 일반적인 값

class SomeClass[+A <: AnyRef, +B <: Any] 

그것을 지정하려면 항상 너무 일반적인 매개 변수의 유형을 지정해야합니다. 나는. 가장 일반적인 버전을 메서드 매개 변수 유형으로 지정하려면 def someMethod(param1: SomeClass[AnyRef, Any]) 또는 new SomeClass[AnyRef, Any]을 인스턴스화해야합니다. 복잡한 제네릭을 가진보다 복잡한 유형의 경우에는 큰 고통이됩니다.

일반 정보를 제공하지 않을 때 [AnyRef, Any] 부분을 암시적인 것으로 만들 수있는 방법이 있습니까? 예를 들어 def someMethod(param1: SomeClass)?

방법이 있습니까? _이 문제를 해결하는 데 도움이 될 수 있습니까?

P.S. 원래 질문을 분명하게 진술하지 않았 음을 사과드립니다.

+1

당신은 어떤 입력을 저장 한 후, 당신은 유형 SomeClassAny ='같은 유형의 별칭을 시도 할 수있는 경우 SomeClass [AnyRef, Any]'. – huynhjl

+0

기본 '값'(질문의 제목 참조)은 다음과 같이 약간 다릅니다 :'class Foobar (b : Int = 42)'; 타입 매개 변수에 대해 이야기하고 있습니다. –

+0

@huynhjl 'type'이 가장 적합한 해결책이라고 보입니다. 당신은 대답으로 게시해야합니다 –

답변

7

:

type SomeClassAny = SomeClass[AnyRef, Any] 
3

어때요?

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class SomeClass[+A <: AnyRef] 

object SomeClass { 
    def apply() = new SomeClass[AnyRef] 
} 

// Exiting paste mode, now interpreting. 

defined class SomeClass 
defined module SomeClass 

scala> SomeClass() 
res47: SomeClass[AnyRef] = [email protected] 

편집 :

난 당신이 기본 인자 같은 것을 원하지만, 유형 수준에서 생각합니다. 불행히도 Scala에는 이러한 기능이 없습니다. @hyhnhjl에서 제안한대로 별칭을 사용할 수 있습니다. 저에게 저것은 당신의 최선의 방법에 보인다.

+0

제 질문을 재고하십시오 - 나는 약간의 수정을했습니다. 원래 명확하게 진술하지 않아서 유감입니다. –

1

일반적으로 생성자 매개 변수 유형에서 유추 할 수 있지만 생성자가 매개 변수를 사용하지 않으면 형식을 명시 적으로 지정해야합니다. 물론 missingfaktor가 지적했듯이, 당신은 언제나 타이핑을 줄이기위한 방법을 쓸 수 있습니다.

+0

제 질문에 대한 재검토를 부탁드립니다. 원래 명확하게 진술하지 않아서 유감입니다. –

5

이 유형이 무엇인지에 대해 신경 쓰지 않으면 [_, _]을 사용하여 매개 변수화 할 수 있습니다. 예를 들면 좀 더 명확 그것의 본질에 대한, 밑줄가 "실존 적 형태"로 알려져 있으려면

val thing = new SomeClass[_, _]() 

또는

def thingDoer(sc: SomeClass[_, _]) { /* Stuff */ } 

같은 것들을 수 있습니다, 그것은 기본적으로 원시 형의 등가이다 Java에서 사용할 수 있으며 Java의 와일드 카드 유형과 유사하게 작동 할 수 있습니다. 예를 들어,이 정신 분열증 자바 코드의 경우

public void thingThatTakesAMapList(List<? extends Map> mapList) { /* Whatever */ } 

이 스칼라 코드 또한

def thingThatTakesAMapList(mapList: List[_ <: Map[_, _]]) { /* Some incredibly wild subroutine */ } 

와 동일하기 목록 사이의 구별을을 주목할 필요가 [임의]과 목록 [_]는 매우입니다 ... 세밀한. 전자가 Any의 목록이고 후자가 [I do not know/care] 목록입니다. _ 은 모두 Any 이외의입니다.예를 들어, 당신은 할 유효하지 않을 것

class SillyClass[T <: Map[_, _]] 

이 서명으로 클래스를 가지고이

val thing = new SillyClass[Any]() 

동안

val thing = new SillyClass[HashMap[_, _]]() 
을하는
유효 할 수있다

과 같이 함수가 SillyClass를 매개 변수로 사용하는 경우 다음과 같이 쓸 수 있습니다.

def sillyClassTaker(sc: SillyClass[_]) 

이고 sc가 이 아니고이 유형 Any에 대해 매개 변수가 지정되어야합니다. Map [_, _]의 일부 알 수없는 서브 클래스를 통해 매개 변수화됩니다. 즉, 밑줄은 자리 표시 자이지만 유효 형식 매개 변수가 여전히 필요합니다. 그래서, 그 모든 시원하고 모든 ... 나는 그것을 너무 많이 사용하지 않는 것이 좋습니다. 와일드 카드 -y를 사용하거나 간단히 유형 매개 변수에 신경 쓰지 않으면 고려해야 할 좋은 옵션입니다. 타이핑을 절약 할 수있는이 같은 일을하고, 내 댓글에 제안하고 매우 간단합니다으로

+1

설명해 주셔서 감사합니다. 그러나'List [_ <: Map [_, _]]'과'List [Map [_, _]]'사이의 실질적인 차이점은 무엇입니까? 'List [_]'와'List [Any]'사이에? –

+0

귀하의 질문에 답변하기 위해 내 게시물을 편집했습니다. – Destin