【问题标题】:Java Map weird behaviourJava Map 奇怪的行为
【发布时间】:2017-09-27 03:00:45
【问题描述】:

我正要在 Java 中尝试一些东西并遇到以下问题,在我解释这里的所有内容之前都是我的代码:

主类:

package com.company;

import java.util.HashMap;

public class Main {

    public static void main(String[] args) {
        // write your code here

        HashMap lol = new HashMap();

        Student david = new Student("David", "Shite");

        lol.put("First:", david);

        System.out.println("HashMap key: " + lol.keySet());
        System.out.println("Value of the key: " + lol.get("First:"));
        System.out.println("Student's first and last name: " + 
((Student)lol.get("First:")).getFirstName());

    }
}

学生班:

class Student {

    private String firstName;
    private String lastName;

    public Student(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
     }

    public String getFirstName(){
        return this.firstName;
     }

    public String getLastName() {
        return this.lastName;
     }
 }

我的问题是关于这行代码:

System.out.println("Student's first and last name: " + 
    ((Student)lol.get("First:")).getFirstName());

这可行,但一开始我尝试过:

System.out.println("Student's first and last name: " + 
                (lol.get("First:").getFirstName()));

上面的代码不起作用,因为它 (IntelliJ) 无法识别方法“getFirstName()”,并出现以下错误:

java: 找不到符号 符号:方法 getFirstName() 位置:类 java.lang.Object

之后我尝试强制转换它并且它会工作,但我不确定为什么当放入 HashMap 的值是 Student 类型的对象并且 getFirstName() 是有效的 getter 方法时,如果不强制转换它就不能工作在提到的类中。

我也尝试了这个以确保它仍然是 Student 类的实例并且没有隐式转换为 Object 类:

System.out.println(lol.get("First:") instanceof Student);

System.out.println(lol.get("First:").getClass());

第一条语句的输出为真,第二条语句的输出为“class com.company.Student”,那么有人可以解释为什么它无法识别 getter 方法调用而不将返回值显式转换为 Student 类吗?

【问题讨论】:

    标签: java object hashmap return


    【解决方案1】:

    您正在使用原始 HashMap 类,它将键和值视为对象。为了让它识别学生,你应该使用

    HashMap<String, Student> lol = new HashMap<>();
    

    【讨论】:

    • 是的,这就是解决方案。
    【解决方案2】:

    这应该没什么奇怪的。该对象必须由Foo 类型的变量显式引用,然后才能使用Foo 方法。

    您可以在这里亲自查看:

    Student david = new Student("David", "Shite");
    Object object = david;
    object.getFirstName(); // won't work
    

    如果您正确使用泛型,例如Map&lt;String, Student&gt; lol = new HashMap&lt;&gt;(),这将解决问题。但通常,您只能访问已知在 compile time 类型的引用上的方法。

    【讨论】:

    • 好吧,我真的不知道这一点,或者正如 Gyrotank 所说的集合的“原始类型”,因为我是 Java 新手,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2023-04-06
    • 2018-08-15
    • 2015-12-04
    相关资源
    最近更新 更多