2017-11-28 3 views
0

개체의 모든 필드를 가져 오는 일반 메서드를 작성해야하며이 개체의 클래스는 ClassTag를 포함 할 수 있으므로 가져올 방법을 찾아야합니다. 좋은 길? 어려움은 클래스를 미리 알지 못한다. ClassTag (0부터 많은 것)까지 포함 할 수있다. 스칼라 클래스 인스턴스에서 classtag 가져 오기

class A(x : Int) {} 

a = new A(1) 

우리는 출력 X => 1

class B[T: ClassTag]() {} 

b = new B[Float]() 

우리는 출력 _ $ 1 = 당신에게 쌍의 배열을 줄 것이다

답변

1
def fields(obj: AnyRef) = obj.getClass.getDeclaredFields.map(field => (field.getName, field.get(obj)) 

플로트해야한다 예를 들어

, 필드 이름과 해당 값을 원하는 형식으로 마사지 할 수 있습니다. 유형을 테스트하고 ClassTag이 있는지 여부에 따라 무언가를 할 수 있습니다.

그러나 특정 예제

: 어느 A에서 xBClassTag이 필드, 그들은 인스턴스의 어디에도 저장되지 않습니다 단지 생성자 매개 변수입니다.

class A(private val x: Int) 
class B[T]()(private val tag: ClassTag[T]) 

을하거나 생성자 외부 몸 어딘가에서 사용하고 있는지 확인이를 변경하려면, 당신은 val로 선언 할 수 있습니다.

+0

고마워,하지만 내 질문에 우리가 클래스를 수정할 수 없다면 여전히 ClassTag 값을 얻을 수있는 방법이 있습니까? 직렬화를 할 때 scala 자체가 어떻게 처리되는지 확실하지 않다 ... –

+0

내가 말했듯이,이 특정 'B'가 아니라. 그리고 그것은 표준 직렬화에도 적용됩니다 : ClassTag는 처음에는 직렬화되지 않습니다 ... –

관련 문제