Tôi đang gặp lỗi trong trình biên dịch Java, nơi thứ tự các tệp được gửi để biên dịch có thể khiến mã không biên dịch. Tôi đã khoan xuống mã để cô lập số lượng nhỏ nhất của mã tôi có thể để tái tạo các vấn đề, kết quả là three source files (mỗi lớp 1).Giải pháp khắc phục lỗi biên dịch javac trong maven
public interface ActionSpec {
public abstract int run(String param);
}
public enum Actions implements ActionSpec {
SKIP {
public int run(String d) {
return 0;
}
};
}
public class Program {
public static void main(String[] args) {
Actions.SKIP.run("hello");
}
}
Sự cố có thể tái tạo bằng cách có đối số javac theo thứ tự cụ thể. Nói tóm lại, để thành công, các lớp Hoạt động luôn luôn phải được biên soạn trước lớp Chương trình trong đó sử dụng nó, nếu không javac chỉ thất bại trong việc đối phó với nó một cách lành mạnh:
# this case fails
echo "Trying order: javac Program.java Actions.java ActionSpec.java"
rm *class
javac -verbose Program.java Actions.java ActionSpec.java
# this case fails
#rm *class
#javac Program.java Actions.java ActionSpec.java
# this case fails
#rm *class
#javac ActionSpec.java Program.java Actions.java
# this case succeeds
#rm *class
#javac ActionSpec.java Actions.java Program.java
# this case succeeds
#rm *class
#javac Actions.java ActionSpec.java Program.java
# this case succeeds
#rm *class
#javac Actions.java Program.java ActionSpec.java
Các lỗi biên dịch, khi nó xảy ra , luôn luôn giống nhau - phương thức chạy trên các cá thể Action enum không thể được tìm thấy, mặc dù chúng đều thực hiện một giao diện có phương thức chạy đó.
Program.java:6: cannot find symbol
symbol : method run(java.lang.String)
location: class problem.Actions
Actions.SKIP.run("hello");
Lỗi này có vẻ liên quan đến this one reported on Oracle's site. Tôi đang sử dụng javac 1.6.0_29, trên mac os x 10.7.2 x86_64, nhưng cũng đã sao chép nó trên Linux.
Vấn đề này trở nên rõ ràng khi tôi đang sử dụng Maven để xây dựng và dường như không có bất kỳ kiểm soát nào đối với thứ tự biên dịch. Vì vậy, tôi đang tìm một workaround hoặc lực lượng maven để biên dịch các tập tin theo thứ tự như vậy là để tránh lỗi trình biên dịch này, hoặc fiddle với cờ biên dịch (hoặc một cái gì đó giống như nó) để tránh nó. Các vấn đề cây trồng lên trên máy trạm và trong môi trường hội nhập liên tục như nhau, vì vậy nó sẽ phải làm việc trên bảng. Bất kỳ đề xuất?
EDIT: Chỉ cần thử cách giải quyết sau, mặc dù chỉ đơn thuần chỉ định enum được đề cập đến một biến với loại giao diện mà nó triển khai, gây ngạc nhiên cho lỗi biến mất.
public class Program {
public static void main(String[] args) {
ActionSpec a = Actions.SKIP;
a.run("hello");
}
}
Vẫn quan tâm đến ý kiến của người khác.
Không ngạc nhiên khi việc giới thiệu 'ActionSpec' bắt đầu hoạt động. Có lẽ lỗi được giới hạn trong enum và những gì nó thực hiện. 'Import' cũng có thể hữu ích. –
Bạn đã thử thêm phương thức 'abstract abstract int (String d);' vào enum chưa? –
Không nên cần phải kể từ khi lớp enum thực hiện giao diện, và tất cả các trường hợp của nó chứa triển khai thực hiện của phương thức (hoặc khác enum sẽ không biên dịch). –