Có một phương pháp trong thư viện hamcrest:Đối với phương pháp loại T, loại 'suy ra' của nó là gì khi cần hai đối số <? super T>?
package org.hamcrest.core
...
public static <T> Matcher<T> allOf(Matcher<? super T> first, Matcher<? super T> second) {
List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>(2);
matchers.add(first);
matchers.add(second);
return allOf(matchers);
}
Trong mã của tôi, tôi gọi phương pháp này với first
là Matcher<Object>
và second
là Matcher<SomeException>
.
Và bây giờ:
- Khi tôi biên dịch nó với Eclipse với 1,6 mục tiêu, nó làm cho
<T>
Matcher<SomeException>
. - Khi tôi biên dịch nó với javac 1.7 với mục tiêu 1.6, nó làm cho
<T>
Matcher<SomeException>
. - Khi tôi biên dịch nó với javac 1.6 với 1.6 mục tiêu, nó làm cho
<T>
Matcher<Object>
Câu hỏi đặt ra là, những gì <T>
phải ở trong trường hợp như vậy?
Hiểu biết của tôi là có lỗi trong javac 1.6 và phải là Matcher<SomeException>
, vì đây là loại phổ biến cho đối số đầu vào (SomeException là một kiểu con của đối tượng) và sau đó, nó chắc chắn 100%. Matcher sẽ là Matcher<SomeException>
.
Tôi có đúng không? Và có cách nào để buộc javac 1.6 hoạt động đúng không?
Bắt kịp với CoreMatcher, nhưng đó là CoreMatchers trong hamcrest của tôi :) Về điểm thứ hai - tôi biết. Tôi đã có thể biên dịch với nhật thực và chạy thử nghiệm mvn sau đó. – Marcin