我从 Java 8 切换到 Java 17。代码现在无法编译
具体来说,从
com.sun.java.swing.plaf.windows
包导入现在无效。
java: 包 com.sun.java.swing.plaf.windows 不存在
但是,它确实存在。只是新的编译器不合理而已。现在由于某种原因它拒绝承认它的存在。
编译错误,com.sun.java.swing.plaf.windows不存在
这些 com.sun.java.swing 包从未打算在 Java 本身之外使用,也不应该直接使用。 Java 现在强制执行这一点。
好吧,但我们还是引用了这个包。 Java 声称是向后兼容的,因此任何在旧版本中合法的内容在新版本中也应该合法
那么我们该怎么办?
// MRE. Compilation fails. Amazon Corretto 17
package demos.button;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import javax.swing.*;
import java.awt.*;
public class CheckBoxDemo {
public static void main(String[] args) throws UnsupportedLookAndFeelException, ClassNotFoundException,
InstantiationException, IllegalAccessException {
// you don't expect us to pass strings directly, do you?
UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName());
JFrame frame = new JFrame("Check Box demo");
JPanel mainPanel = createMainPanel();
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
private static JPanel createMainPanel() {
FlowLayout layout = new FlowLayout();
layout.setAlignment(FlowLayout.CENTER);
JPanel mainPanel = new JPanel(layout);
mainPanel.add(createCheckBox());
return mainPanel;
}
private static JCheckBox createCheckBox() {
JCheckBox checkBox = new JCheckBox();
return checkBox;
}
}
即使我禁用
--release
选项,代码也不会编译。例如,因为ComboPopup
的getList()
曾经看起来像这样
public JList getList();
现在看起来像这样
public JList<Object> getList();
因此,如果您的
ComboPopup
实现使用了任何类型参数,那么运气不好
// no longer compiles
@Override
public JList<T> getList() {
return itemList;
}
它看起来根本不像向后兼容。这(连同跨平台支持)难道不是 Java 的全部意义吗?
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());