Java Swing - 如何使用泛型在 Swing 组件上创建实用程序类

标签 java swing generics java-7

我有一个 Utils 类:

public static void setComboBoxDefaultWidth(JComboBox cb)
{
    cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}

问题是这会导致编译器警告:

JComboBox 是原始类型。对泛型 JComboBox 的引用应该被参数化

我不确定如何参数化泛型,以便调用方法和函数都能正常工作(没有编译器错误)。无论出于何种原因,我都可以解决一个问题,但不能同时解决两个问题...

最佳答案

事实是JComboBox在 Java6 中不是通用的,但它在 7 中变得通用只是因为设计有缺陷(因为 getItemAt() 返回一个 Object 类型,您必须手动转换它)。

方法声明为

public void setPrototypeDisplayValue(E prototypeDisplayValue)

这意味着,您必须有特定类的特定实例才能调用它,并且类型必须与为您的组合框声明的类型相对应:

public void setComboBoxDefaultWidth(JComboBox<String> cb) {
  cb.setPrototypeDisplayValue("mmmmmmmmmmmmmmmmmmmmmmmmmm");
}

你被迫这样做,因为你正在通过 String方法所以 JComboBox必须包含 String

上述解决方案是当您要调用的方法需要泛型类型的参数时需要执行的操作。否则你无法指定它(没有说明目标的数量)并且你将不得不使用通配符 ?存在:如果一个方法不关心泛型类的具体类型是什么,你只需要指定 JComboBox有一个通用类型而不用担心类型是什么:

public static void setComboBoxDefaultWidth(JComboBox<?> cb) {
    cb.setLightWeightPopupEnabled(true);
}

语法 <?>只是字面上的意思未知类型,参数确实是一个JComboBox未知类型的项目。

关于Java Swing - 如何使用泛型在 Swing 组件上创建实用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738159/

相关文章:

java - JAXWS-RI 模块需要每个服务接口(interface)的实现

java - 从 ArrayList 填充 jTable

java - 需要行动监听者的建议

java - 如何在 Java 内部类中定义绑定(bind)类型参数

Java泛型类作为参数

java - 在Java中找不到符号 'JTextField'

java - 使用回调方法连接多个线程结果

Java 动手练习(带图)

java - 图像没有出现在 Swing 中?

c# - 如何配置 StructureMap 以使用通用存储库?