![](/img/trans.png)
[英]How to extend Generic abstract Class with <E extends Comparable<E>>
[英]An instantiable Java generic for <E extends Comparable<E>>
我有一个类(假设是手推车,在英语中也称为“购物车”),该类加载一堆字符串或整数的对象。 用户指定一个标志来声明应如何读取输入。 手推车类只关心对象在分类方面是可比的。 但是,我在为字符串和整数重用同一手推车对象时遇到了麻烦。 为了解释,这是一个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<? extends Comparable<?>> items = new Trolley<? extends Comparable<?>>()
Trolley<? extends Comparable<?>> items = new Trolley<? extends Comparable<?>>()
但这也不起作用。 我直觉地猜想这里的问题是我可以将任何可能无法相互比较的对象添加到Trolley
,例如字符串和整数的混合,而我想要一个只接受一种类型的Comparable
的Trolley
对象...但是随便哪种。)
(编辑:我应该补充,我宁愿避免使用像Item
这样的包装器类,因为此代码将受到内存限制。)
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");
}
}
我使用的最终解决方案(受@assylias的回答启发):
public static void main(String args) {
boolean numeric = false;
Trolley<? extends Comparable<?>> trolley = null;
if (numeric) {
Trolley<Integer> trolleyN = new Trolley<Integer>();
trolleyN.addItem(42);
trolley = trolleyN;
} else {
Trolley<String> trolleyS = new Trolley<String>();
trolleyS.addItem("42");
trolley = trolleyS;
}
// use trolley in "read-only" mode
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.