java - <E extends Comparable<E>> 的可实例化 Java 泛型

标签 java generics

我有一个类(比方说一个手推车[又名美国“购物车”]),它加载一堆字符串或整数的对象。用户指定一个标志作为输入,以说明应如何读取输入。 trolley 类只关心对象是否具有可比性以进行排序。但是,我在为字符串和整数重用相同的手推车对象时遇到问题。为了解释一下,这里有一个 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 的对象...但是任何类型。)

(编辑:我应该添加,我宁愿避免使用像 Item 这样的包装类,因为此代码将受到内存限制。)

最佳答案

一个Trolley<?>Trolley属于特定类型,但我们不知道是哪种类型。

碰巧在您的代码中它很可能是 Trolley<Integer>Trolley<String> .

因此编译器不允许您添加除 null 之外的任何内容到那个手推车,因为它的实际类型只能在运行时确定。

为了使代码在编译时无需进行太多更改,您需要有一个用于整数的分支和一个用于字符串的分支:

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");
  }
}

关于java - <E extends Comparable<E>> 的可实例化 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850693/

相关文章:

java - 如何修复 'Unchecked cast from MyClass to T'

java - 了解 Java 中泛型的语法

java - 用于求解表达式的简单 Java 计算器

java - Java 中是否有类似于 C# 的匿名类型的功能?

java - 从 javascript 到 java servlet 的 HTTP POST

java - 如何在不使用配置程序的情况下调整 Tomcat 5.5 JVM 内存设置

java - 在依赖接口(interface)上强制执行参数类型?

java - 访问参数化类型的类名

java - List<Character>如何获取具体索引?

c# - 通用列表修改 C# 中的属性值