Tôi muốn viết một loại mã an toàn. Đây là những gì tôi đã cố gắng:Viết một lớp học theo kiểu an toàn
public interface ResultTronsformer<T>{
public T tranform(T t);
}
public class BigDecimalTransformer implements ResultTRansformer<BigDecimal>{
public BigDecimal transform(BigDecimal t){
return t.setScale(0);
}
}
Bây giờ tôi xác định giao diện Cột trông giống như
public interface Column{
public ResultTransformer<?> getTransformer();
}
và muốn sử dụng nó trong các phương pháp
public class Report{
private Map<Column, Object> columnValuePairs;
public void putIntoACollection(Column c, Object columnsValue){
ResultTransformer<?> rt = c.getTransformer();
columnValuePairs.put(c, rt.transform(o)); //Error: Couldn't convert Object
//to the capture of wildcard
}
}
Làm thế nào tôi có thể sắp xếp lại thiết kế để đạt được loại an toàn mong muốn? Có lẽ tôi nên làm các loại kiểm tra tại thời gian chạy thay vì (ném một ngoại lệ)?
Hệ thống kiểu Java không mạnh mẽ h để làm điều này. Nhưng bạn có thể sử dụng một số thư viện trình bao bọc để hiển thị ** API an toàn bên ngoài **. Ví dụ: http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ClassToInstanceMap.html – Max
@Max Intersting, chưa được nghe về phương pháp đó. Có lẽ bạn có thể cung cấp một ví dụ như một asnwer? – user3663882