Trong khi chơi xung quanh với các giải pháp cho this question, tôi đã đưa ra đoạn mã sau, trong đó có một số cảnh báo trình biên dịch. Một cảnh báo là:Phương pháp chung kích hoạt lỗi an toàn loại - tại sao?
Type safety: The expression of type Test.EntityCollection needs unchecked conversion to conform to Test.EntityCollection<Test.Entity>
tôi không hoàn toàn hiểu tại sao cảnh báo này xuất hiện. Bằng cách chuyển một loại Class<M>
và khai báo phương thức trả về EntityCollection<M>
, tại sao tôi không làm đủ để thuyết phục trình biên dịch (Java 7) rằng kiểu chính xác đang được trả về?
static class Entity {
}
static class EntityCollection<E extends Entity> {
private EntityCollection(HashMap<?, E> map) {
}
public static <T extends HashMap<?, M>, M extends Entity> EntityCollection<M> getInstance(
Class<T> mapType, Class<M> entityType)
throws ReflectiveOperationException {
T map = mapType.getConstructor().newInstance();
return new EntityCollection<M>(map);
}
}
public static void main(String[] args) throws Exception {
// both compiler warnings are on the line below:
EntityCollection<Entity> collection = EntityCollection.getInstance(
LinkedHashMap.class, Entity.class);
}
Điểm thưởng nếu có ai có thể cải thiện mã để tránh hoàn toàn cảnh báo. Tôi đã nhìn chằm chằm vào nó trong một thời gian và đã không mơ ước bất kỳ cách nào để giảm bớt các cảnh báo.
Hmm, với một chút thử nghiệm hơn tôi không thể nhận hoặc Java 7 hoặc Java 8 để phản đối điều này (ngoại trừ một "bạn có thể sử dụng suy luận kim cương" trên 'return new EntityCollection (map)'). Khác hơn là nó rất hạnh phúc. Tôi đang sử dụng netbeans –
@RichardTingle Tôi có thể nhận được Java 1.8.0_05 để cho tôi cảnh báo nếu tôi biên dịch với 'javac -Xlint: all' trên dòng lệnh. –