2017-12-19 8 views
0

되지 않습니다 :스칼라 T는 내가 좋아하는 방법이 클래스

def loadConfiguration[T <: Product](implicit A: Configs[T]): T = { 

및 클래스를

trait SparkBaseRunner[T <: Product] extends App { 

ConfigurationUtils.loadConfiguration[T] 

같은 SparkBaseRunner 클래스 내에서 첫 번째 방법을 호출 컴파일 오류 :

T is not a class 

제네릭 관련 문제를 해결하려면 어떻게해야합니까?

+0

'T'는 그냥 자리 표시 자 이름입니다. 구체적인 방법을 지정할 때 메서드를 호출 할 때 – puhlen

+0

구체적인 이름을 지정해야합니다. 'case class Foo()', 즉'Foo'와 같은 클래스의? –

+0

예, 'Product'를 확장하는 모든 클래스가 수행합니다. 'T <: Product '는 어떤 유형을 선택하든'Product를 확장해야 함을 의미합니다. case 클래스와 튜플은 모두 암시 적으로'Product'를 확장합니다. – puhlen

답변

2

"SparkBaseRunner 클래스에서 첫 번째 메서드를 호출 할 때"implicit A: Configs[T]도 사용할 수 있어야하며, 그렇지 않은 경우가 필요합니다. 이 오류는이 라이브러리가 찾는 방법에서 비롯된 것입니다. 모든 방법에 암시 적 매개 변수를 추가 할 수 있습니다, 형질을 할

abstract class SparkBaseRunner[T <: Product](implicit A: Configs[T]) extends App { 

// in extending class (Bar is a case class or 
// some other type for which an implicit Configs[Bar] exists) 
class Foo extends SparkBaseRunner[Bar] { ... } 

SparkBaseRunner 만약 필요 :

쉬운 방법은 그것을 추상 클래스에 특성에서 변화 필요 생성자 매개 변수를 확인하는 것입니다 그것을 필요로하거나 그것을 추상적으로 만들거나

+0

특성에 대한 추상 수업을 권장 하시겠습니까? –

+0

이 경우에만 네,하지만 다른 요구 사항에 따라 다릅니다. –

+0

예. 이미 수퍼 클래스가있는 다른 클래스와 섞여 있어야하는 경우에는 특성이어야합니다. –