gpt4 book ai didi

Java多态和向下转型

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:03 24 4
gpt4 key购买 nike

我正在使用 Java 的反射 API,我正在编写检查给定对象并描述其字段、方法等的方法。

我正在使用 getFields() 方法迭代不同的属性并显示对象内容:

public static void display(Integer i)
{
System.out.println("An integer: " + i);
}

// Basically a method for each primitive type wrapper

public static void display(Object o)
{
for (Field f : c.getFields())
{
System.out.println("A " + o.getClass() + " which is composed of:");
display(f.get(o));
}
}

(为简单起见,省略了其他基本类型和数组。)

尽管 Fieldget 方法返回一个 Object,我认为正确的方法会被基本类型包装器调用(整数,字符串等),但实际上,只有 display(Object o) 被调用(没有执行隐式向下转换)。

目前,我找到的唯一解决方案是尽可能粗暴地向下转换对象,如下所示:

public static void display(Object o)
{
if (o instanceof Integer)
{
display((Integer) o);
return;
}
else if (o instanceof String
{
...
} // And so on

for (Field f : c.getFields())
{
System.out.println("A " + o.getClass() + " which is composed of:");
display(f.get(o));
}
}

但这看起来确实很丑陋,我想知道是否有更优雅的方法来确保调用正确的方法。有什么想法吗?

在此先感谢 StackOverflow 的好心人!

最佳答案

好问题。我昨天晚上也想知道 ;)

所以答案是有两种不同类型的多态性:编译时多态性和运行时多态性。

当您使用父类(super class)型的方法和 sybtypes 的覆盖方法时,这就是运行时多态性。

当您使用父类(super class)型和子类型作为不同重载方法的参数时,这就是编译时多态性。

因此,在您的情况下,编译器必须在编译时知道要执行哪个方法(/重载),它不会在运行时做出这个决定。

如果您可以控制字段类,那么一个解决方案是使用泛型,这样您就可以定义一个

class Field<T> 

用一个方法

T get( Object o )

然后编译器将能够在编译时知道使用哪种方法进行显示,因为它会在编译时知道 field.get 返回什么类型。

但是,根据您的评论,您使用了 JDK 的类 java.lang.reflect.Field,因此,您无法控制它以使其通用。在这种情况下,是的,唯一的解决方案是使用一种显示方法来处理 field.get 的所有不同可能类型。但实际上,String.valueOf 方法在这里可以提供很大的帮助,因为它提供了 java 中任何类型的字符串表示,已经完成了您正在寻找的重载工作。

Source here .

问候, 斯蒂芬

关于Java多态和向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com