2013-12-22 1 views
2

을 기록 캐스팅 못해 레코드 종류를 가져, 내 생각 :반환에게 내가 여기에 꽤 표준 구문을 사용하고

Result<Record> = [DSLContext].selectDistinct(...).fetch(); 

하지만 실 거예요 컴파일 때문에 유형

Result<Record4<T1, T2, ...> 

의 위의 수익률 기록 오브젝트 이것은 자동 생성 인터페이스이며 Record의 하위 인터페이스이지만 컴파일러는 여전히 불만족 스럽습니다.

일반적으로 java가 이것을 암시 적 캐스트로 간주할까요? 나에게 어떤 명백한 주조도해야하는 것처럼 보이지 않는다. ...

팁? List<Banana>List<Fruit> 인 경우 감사

답변

1

, 당신은 List<Banana>에 사과를 추가 할 수

List<Banana> bananaList = new ArrayList<>(); 
List<Fruit> fruitList = bananaList; 
fruitList.add(new Apple()); 

그리고 따라서 일반적인 유형의 유형 안전을 깰 것이다.

당신은 아마 불행하게도

Result<? extends Record> result = [DSLContext].selectDistinct(...).fetch(); 
+0

''의 선언 사이트 상한값이 'Record'이므로 '을 편리하게 쓸 수 있습니다 –

1

원 자바는 C# 또는 스칼라 같은 선언 사이트 분산을 알고하지 않습니다

// C# style 
interface Result<out Record> { ... } 

// Scala style 
trait Result[+Record] { ... } 

의 둘 이상 할당 할 수 것입니다 다음

Result<Record4<T1, ...>> r1 = ... 
Result<Record> r2 = r1; 

그러나 Result은 실제로 다음과 같이 정의됩니다.

쿼리 식을 Record4<T1, ...><R>는, 이것이 결합 이후
interface Result<R extends Record> {} 

이제, 당신이받을거야 :

Result<Record4<T1, ...>> r1 = selectDistinct(...).fetch(); 

을 양자 택일로, 당신은 와일드 카드를 사용할 수 있습니다

Result<? extends Record> r2 = r1; 

// Or shorter: 
Result<?> r3 = r1; 

또 다른 옵션은 쿼리를 표현할 때 유형을 안전하게 제거하는 것입니다.

Result<Record> r4 = selectDistinct(new Field[] { ... }).fetch(); 
+0

ohhhhh ... right! 고마워요. – toilinginobscurity

+0

@ toilinginobscurity : 어느 부분이 가장 도움이 되었습니까? :-) –

+0

안녕하세요 lukas - 내가 정말로 필요로하는 것은 제네릭, 와일드 카드 등의 미니 튜토리얼이었습니다. 주전자는 근사합니다. 열심히 노력해 주셔서 감사합니다. – toilinginobscurity