2014-08-29 1 views
1
<D extends com.j256.ormlite.dao.Dao<T,?>,T> D getDao(Class<T> clazz) 

자바 제네릭 형식 구문 내가 문 위에 이해할 수 없습니다입니다

getDao (클래스 clazz에)는 D에게 다음과 같은 제약

D extends com.j256.ormlite.dao.Dao<T,?> 

및 추가 , T을 가진

D를 반환 나는 이해할 수 없다.

설명해 주시겠습니까?

+0

이 방법은 'D'와 'T'의 두 가지 유형 매개 변수가 필요하며 'D'는 'T'에 따라 추가 '확장'제약 조건을가집니다. 이 ', T'에 혼란스러워하지 마십시오. 함께 속하지 않습니다. –

답변

2

이 방법은 DT에 따라 추가 extends 제약을 갖는 두 타입 파라미터 및 DT을 갖는다. 이 <T,?>,T 구문으로 혼동하지 마십시오. ,T이 아니며은 제약 조건에 속하지만 두 번째 매개 변수이므로 T이 구체적인 클래스 이름이 아님을 Java에 알립니다.

매개 변수를 추가하거나 매개 변수를 바꾸면 명확 해집니다. 비슷하지만 다소 간단한 예제가 있습니다. 이 메소드 서명은 모두 동일합니다

<D extends List<T>,T> D createListOf(Class<T> clazz) // your version 
<D extends List<T>, T> D createListOf(Class<T> clazz) // extra space 
<T, D extends List<T>> D createListOf(Class<T> clazz) // different order 

그것이 T 다른 유형 매개 변수 인 것은 분명 보인다하더라도, 명심,이 자바 명확하지 않다. T이라는 실제 클래스가있을 수 있으므로 T이 형식 매개 변수임을 명시해야합니다.

class T { ... } // this T is not what I want! 

반대로 유형 매개 변수는 단일 문자로 제한되지 않습니다. 동료를 완전히 혼동하려는 경우 Foo 또는 심지어 String이라는 유형 매개 변수가있을 수 있습니다. 어쩌면 <...>을 사용하는 모든 유형 매개 변수의 선언이 필요한 이유가 분명해집니다.

// just a deterrent example; don't do this! String as parameter, not class 
<String, Foo extends List<String>> Foo createListOf(Class<String> clazz) 
+0

\ @tobias_kas 리턴 타입의 초 파라미터가 자바에 T가 구체적인 클래스의 이름. 동일한 정보가 첫 번째 매개 변수 자체와 함께 전달 될 수 있습니까? –

+0

@AmitYadav 당신은'D'에 대한 제약 조건에서 'T'가 사용되는 것만으로 충분하지 않아야합니까? 아니요. 클래스 이름에 문자가 두 개 이상 있어야한다는 규칙은 없으므로 'T'도 구체적인 클래스 이름을 사용할 수 있습니다. –

+0

\ @tobias_k 나는 T라는 이름의 클래스를 만들 수 있다는 것에 동의한다. Generic 타입에 대한 충분한 지식이 없다고 생각한다. 모두 당신은 두 번째 매개 변수로 반환 유형 T에서 T가 구체적인 클래스가 아니라는 것을 자바에 알리는 것을 의미합니다. 나중에이 개념을지지 할 수 있기를 바랍니다. 감사! –

1

이 방법 것이다

  • 복귀 유형의 객체 D이거나 형 T 또는 T 구현/연장 미지 타입 파라미터
  • 의 목적으로 매개 변수화 com.j256.ormlite.dao.Dao를 확장 D
  • 인수로서 주어진 경우, 유형의 클래스 T

많은 추상 추상화를 사용합니다. DAO (Data Access Object)를 제공한다는 점에서 놀라운 것은 아닙니다.

+0

반환 유형에 대해 혼란 스럽습니다. D <첫 번째 제약 조건, 두 번째 제약 조건> 첫 번째 제약 조건 = D는 com.j256.ormlite.dao.Dao를 확장합니다. 내게는 괜찮습니다 ... 정말 두 번째 제약 조건이 필요한지 묻습니다. –

+0

내가 무슨 뜻인지 알 것 같아.일반적인 메소드이기 때문에, 타입 파라미터'T'는 거기에서 선언되어야합니다. 그렇지 않으면 method 매개 변수 나'com.j256.ormlite.dao.Dao'의 매개 변수화에 의해 참조 될 수 없다. – Mena

+0

\ @ 메나 나는 메소드의 인자 T와 혼동하지 않는다. 대신 T 타입의 리턴 값을 두 번째 인자로 언급했다. <첫 번째 파라미터, T> D –

관련 문제