当前位置: 首页 > 知识库问答 >
问题:

不同类型集合的集合重载

朱岳
2023-03-14

我知道重载是在编译时决定的,但当我试图运行下面的示例时,它给出了我无法理解的结果

package miscellaneous;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionsOverloading {

public static String classify(Set<?> s) {
    return "Set";
}

public static String classify(List<?> s) {
    return "List";
}

public static String classify(Collection<?> s) {
    return "Collection";
}

public static void main (String args[]) {

    Collection<?>[] collections = { new HashSet<String>(), new ArrayList<String>(), new HashMap<String, String>().values()};

    for (Collection<?> coll : collections) {
        System.out.println(classify(coll));
    }
    }
}

当我每次运行这个代码片段时,我都会得到“Collection”的输出,这意味着调用参数为Collection的classify方法。

请解释

共有1个答案

文心思
2023-03-14

由于您正在调用的classify方法是静态的,因此您将在编译时而不是运行时选择调用哪个方法。

在编译时,编译器看到CollectionsCollection的数组,因此绑定到classify公共静态字符串classify(Collection<?>s)版本。

Edit:即使这些方法是非静态的,您仍然会发现调用集合版本,因为重载方法在编译时使用静态绑定绑定,而重写方法在运行时使用动态绑定绑定。

 类似资料:
  • Swift 提供了三种主要的集合类型,所谓的数组、合集还有字典,用来储存值的集合。数组是有序的值的集合。合集是唯一值的无序集合。字典是无序的键值对集合。 Swift 中的数组、合集和字典总是明确能储存的值的类型以及它们能储存的键。就是说你不会意外地插入一个错误类型的值到集合中去。它同样意味着你可以从集合当中取回确定类型的值。 注意 Swift 的数组、合集和字典是以泛型集合实现的。要了解更多关于泛

  • 本页包含内容: 数组(Arrays) 集合(Sets) 字典(Dictionaries) 集合的可变性(Mutability of Collections) Swift 语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储相同类型的数据。字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对)。 Swift 语言里的数组和字典中存储的数据值类型必须明确。 这意

  • 问题内容: 如果我有一个通用类: 我想实例化几个项目,例如… …并将它们添加到集合中。如何定义集合,使其可以容纳泛型类型列表?然后,我想在某个时刻迭代集合,并使用Value属性。可能? 问题答案: 让您的泛型类从非泛型基类继承,或实现一个非泛型接口。然后,您可以拥有此类型的集合,并将其转换为用于访问集合内容的任何代码。 这是一个例子。

  • 就像C++的stl一样,Rust提供了一系列的基础且通用的容器类型。善用这些集合类型,可以让Rust编程更加方便轻松,但每种数据结构都会有其局限性,合理的选型方能维持更好的效率。 本章目录: 动态数组 Vec 哈希表 HashMap

  • 问题内容: 在解决了之前的问题的基础上,但又导致了另一个问题。如果协议/类类型存储在集合中,则取回并实例化它们会引发错误。下面是一个假设的例子。该范例基于“程序到接口而不是实现”,“程序到接口” 编辑 -我当前的解决方法是遍历集合,但是由于api必须知道各种实现,所以这当然是有限的。另一个限制是这些类型的子类(例如PersianCat,GermanShepherd)将不会调用其重写的函数,否则我将

  • 我想使用流从类型B创建类型a的集合。 假设我有两节课 为了从员工集合中创建人员集合,我编写了以下代码 目前,这段代码可以正常工作。但我想知道,是否有更好的方法可以不使用forEach从员工创建人员集合。