Tôi có hai cấu trúc phân loại đẳng cấu. Loại cơ sở của loại đầu tiên là BaseA và loại cơ sở của loại thứ hai là BaseB. Tôi biết làm thế nào để chuyển đổi bất kỳ đối tượng của bất kỳ phân lớp của BaseB để subtype tương ứng của nó của BaseA. Tôi muốn thực hiện một phương thức lấy đối tượng kiểu BaseB xác định lớp của nó và xây dựng một đối tượng của kiểu con tương ứng của BaseA. Mã ví dụ:Generics Java: <B mở rộng BaseB> không khớp <? mở rộng BaseB>
public interface BaseA...
public interface BaseB...
public class DerA implements BaseA...
public class DerB implements BaseB...
...
public interface Transform<A,B> {
A toA (B b);
}
public class DerAtoDerB implements Transform<DerA,DerB> {
DerA toA (DerB b){...}
}
public class Transformations {
private static Map<Class<?>, Transform<? extends BaseA, ? extends BaseB>> _map =
new HashMap<>();
static {
_map.put(DerB.class, new DerAtoDerB());
}
public static <B extends BaseB> BaseA transform(B b){
Transform<? extends BaseA, ? extends BaseB> t = _map.get(b.getClass());
return t.toA(b); // Compile error: Transform<A,B#2> cannot be applied to given types
}
Tại sao <B extends BaseB>
không tương thích với <? extends BaseB>
? Ngoài ra nếu tôi cố gắng thực hiện chuyển đổi phương pháp tĩnh như thế này:
public static BaseA transform(BaseB b){
Transform<? extends BaseA, ? extends BaseB> t = _map.get(b.getClass());
return t.toA(b); // Compile error: Transform<A,B> cannot be applied to given types
}
tôi nhận được một lỗi biên dịch: Transform<A,B> cannot be applied to given types
bất cứ ai có thể giải thích cho tôi những gì tôi đang làm sai với Generics?
câu trả lời đầu tiên có thể hữu ích cho bạn http://stackoverflow.com/questions/16449799/how-do-generics-of-generics-work – aalku