2016-08-26 36 views
15

Tôi không thể tìm ra lý do sau đây sẽ không biên dịch. Lỗi mà IDE cung cấp cho tôi là "Giá trị của thuộc tính chú thích RequestParam.defaultValue phải là một biểu thức liên tục".Mã Java sẽ không biên dịch do thuộc tính phải là lỗi biểu thức liên tục

dự án của tôi liên quan mùa xuân và Maven, và nó đi như sau:

private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE); 

@RequestMapping(method=RequestMethod.GET) 
public List<Spittle> spittles(
     @RequestParam(value="max", 
        defaultValue=MAX_LONG_AS_STRING) long max, 
     @RequestParam(value="count", defaultValue="20") int count) { 
    return spittleRepository.findSpittles(max, count); 
} 

Tôi đang nghĩ đến lỗi xuất phát từ việc chuyển đổi của Long để String, nhưng tôi không biết làm thế nào để sửa chữa nó. Tôi sẽ đánh giá cao bất kỳ sự trợ giúp nào, tôi mới sử dụng các chú thích và Spring.

+0

Phần nào của 'phải là cụm từ liên tục' bạn không hiểu? – EJP

+8

@EJP Có lẽ cô ấy không hiểu tại sao thứ gì đó trông giống như một hằng số thực sự không phải là một hằng số? Đây không phải là tầm thường. – ajb

+1

Thật tuyệt vời, ví dụ của bạn giống như tôi, tôi cũng đọc "Mùa xuân trong hành động". Có rất nhiều loại lỗi như vậy –

Trả lời

27

quy tắc Java nói rằng khi bạn có một chú thích, và nó có một tham số mà hy vọng một loại nguyên thủy (như một int) hoặc một String, giá trị phải là một hằng số biểu hiện. [Điều này không liên quan gì đến Spring.] Nói một cách rõ ràng, một biểu thức liên tục là một biểu thức có giá trị mà trình biên dịch có thể tìm ra tại thời gian biên dịch. Tuy nhiên, có những quy tắc cho những gì tạo thành một biểu thức liên tục. Các quy tắc này nằm trong số JLS 15.28. Chỉ một số loại hoạt động nhất định có thể được sử dụng trong một biểu thức liên tục. Một cuộc gọi phương thức, chẳng hạn như Long.toString(), không phải là một trong số đó. Vì vậy, việc sử dụng biểu thức của bạn làm cho biểu thức của bạn không phải là một biểu thức liên tục, mặc dù nó có vẻ như vậy. Tuy nhiên, trình biên dịch không giữ một danh mục của tất cả các phương pháp để biết cái nào là phương thức "không đổi" có giá trị có thể được tìm ra tại thời gian biên dịch.)

Tuy nhiên, ví dụ tại liên kết cho thấy rằng toán tử + có thể được sử dụng, ngay cả khi một trong các đối số không phải là một chuỗi và do đó phương thức toString() được ngầm gọi. Điều này gợi ý rằng bạn có thể làm cho mọi thứ hoạt động như thế này:

private static final String MAX_LONG_AS_STRING = "" + Long.MAX_VALUE; 

Tôi chưa thử nó.

+0

Ohh! Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn, tùy chọn bạn đã cho tôi không hoạt động! Và liên kết và lời giải thích bạn đã thực sự giúp hiểu thêm về các biểu thức liên tục. Tôi đã không nhận thức được sự khác biệt thời gian biên dịch cho đến khi tôi điều tra nhiều hơn, nhưng không biết nó có liên quan đến việc sử dụng phương pháp. Cảm ơn bạn rất nhiều vì lời giải thích ngắn gọn nhưng tuyệt vời! –

+0

'toString()' là một cuộc gọi phương thức trong thời gian chạy. '" "+ 5' tạo chuỗi không đổi (vì chúng không thay đổi) tại thời gian biên dịch - có thể sai – junvar

+0

@junvar Không có gì ngăn cản trình biên dịch tạo chuỗi liên tục cho' Long.toString (Long.MAX_VALUE) '. Có nhiều trình biên dịch Java và mỗi trình biên dịch có thể quyết định có tối ưu hóa chuỗi này thành chuỗi không đổi hay không. Tuy nhiên, các quy tắc của Java về những gì là hợp pháp hoặc không giống nhau bất kể trình biên dịch. Các quy tắc hợp pháp không phụ thuộc vào các tối ưu hóa tùy chọn mà trình biên dịch có thể hoặc không thể thực hiện. – ajb

Các vấn đề liên quan