Java Map奇怪的行为

时间:2017-04-28 22:11:53

标签: java object hashmap return

我准备在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() location:类java.lang.Object

之后我尝试了它,它会起作用,但我不确定为什么它在没有强制转换的情况下工作,当放入HashMap的值是Student类型的对象时,getFirstName()是在上面提到的类中有效的getter方法。

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

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

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

并且第一个语句和"类com.company.Student"的输出为true。对于第二个,那么有人可以解释为什么它没有明确地将返回值强制转换为Student类而无法识别getter方法调用吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

这不应该有任何令人惊讶的事情。在使用Foo方法之前,必须使用Foo类型的变量显式引用该对象。

你可以在这里看到这个:

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

如果您正确使用了泛型,例如Map<String, Student> lol = new HashMap<>(),这本来可以解决这个问题。但通常,您只能访问已知在引用的编译时类型上的方法。