我有一个类(假设是手推车,在英语中也称为“购物车”),该类加载一堆字符串或整数的对象。用户指定一个标志来声明应如何读取输入。手推车类只关心对象在分类时是否具有可比性。但是,我在为字符串和整数重用同一手推车对象时遇到了麻烦。为了说明,这是一个MWE:import java.util.TreeSet;public class Trolley<E extends Comparable<E>> { public TreeSet<E> items; public Trolley(){ items = new TreeSet<E>(); } public boolean addItem(E item){ return items.add(item); } public static void main(String args){ // read from input boolean numeric = false; Trolley<?> items = null; if(numeric) items = new Trolley<Integer>(); else items = new Trolley<String>(); // items will be parsed from a file if(numeric){ // compiler warning about generic mismatch items.addItem(42); } else{ // compiler warning about generic mismatch items.addItem("42"); } }}这会在addItem(.)调用中给出编译器警告。手推车只会对项目进行排序并将其打印为字符串(即,无论输入是数字还是字符串,后续代码都不会在意)。再次,这只是我想要做的一个类似于MWE的类比(实际上,如果输入事先经过字典编码,我想将有向图加载到内存中,并且加载整数是为了节省内存)。我的问题是如何配置泛型以允许使用同一手推车对象来提取整数和字符串输入?我已经尝试了一些诸如上述通配符和Trolley<? extends Comparable<?>> items = new Trolley<? extends Comparable<?>>()之类的方法,但是那也不起作用。我凭直觉猜想这里的问题是,我可以向Trolley添加可能无法相互比较的任何对象,例如字符串和整数的混合,而我希望Trolley对象仅接受一种类型的 ...但任何类型。)(编辑:我应该补充,我宁愿避免使用类似Comparable的包装器类,因为此代码将受到内存限制。) (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 Trolley<?>是特定类型的Trolley,但我们不知道哪种类型。碰巧在您的代码中它很可能是Trolley<Integer>或Trolley<String>。因此,编译器不允许您向该手推车添加null以外的任何内容,因为其实际类型仅在运行时确定。要使代码无需太多更改即可编译,您需要为Integer设置一个分支,为String设置一个分支:public static void main(String args) { boolean numeric = false; if (numeric) { Trolley<Integer> trolley = new Trolley<>(); trolley.addItem(42); } else { Trolley<String> trolley = new Trolley<>(); trolley.addItem("42"); }} (adsbygoogle = window.adsbygoogle || []).push({});
09-25 19:29