Tôi đã làm việc trên trường hợp chuyển đổi.java 8: sự khác biệt giữa class.getName() và String literal
Nếu chúng ta sử dụng class.getName(), sau đó, tôi nhận được lỗi "trường hợp biểu thức phải là biểu thức hằng số" như sau:
switch(param.getClass().getName())
{
case String.class.getName():
// to do
break;
}
Thậm chí nếu chúng ta sau, lấy chuỗi tên lớp trong một liên tục, sau đó cũng nhận được cùng một lỗi:
public static final String PARAM_NAME = String.class.getName();
switch(param.getClass().getName())
{
case PARAM_NAME:
// to do
break;
}
Nhưng, nếu tôi sau đó, sử dụng các chuỗi chữ "java.lang.String", không có lỗi:
public static final String PARAM_NAME = "java.lang.String";
Ai có thể giải thích điều này, tại sao nó không lấy hai trường hợp đầu tiên và lấy cái cuối cùng? Cảm ơn trước.
Nhưng, tôi đang dùng nó trong biến 'tĩnh cuối cùng' (tức là, hằng số), sau đó, cũng không dùng nó? –
trình biên dịch thực hiện một số phép thuật và tôi giả định hai điều đầu tiên được biên dịch vào cùng một mã byte. Cuối cùng bạn đưa ra, có String literal được sử dụng và do đó nó hoạt động –
@KrishnaKumar Một trường 'final final' không nhất thiết phải là một hằng số biên dịch, ngay cả khi cho mục đích thực tế, nó là một hằng số khi chạy. – chrylis