当前位置: 首页 > 面试题库 >

Java通用/类型调度问题

宇文迪
2023-03-14
问题内容

考虑以下程序:

import java.util.List;
import java.util.ArrayList;

public class TypeTest {

    public static class TypeTestA extends TypeTest {

    }

    public static class TypeTestB extends TypeTest {

    }

    public static final class Printer {
        public void print(TypeTest t) {
            System.out.println("T");
        }

        public void print(TypeTestA t) {
            System.out.println("A");
        }

        public void print(TypeTestB t) {
            System.out.println("B");
        }

        public <T extends TypeTest> void print(List<T> t) {
            for (T tt : t) {
                print(normalize(tt.getClass(), tt));
            }
        }

        private static <T> T normalize(Class<T> clz, Object o) {
            return clz.cast(o);
        }

    }
    public static void main(String[] args) {
        Printer printer = new Printer();
        TypeTest t1 = new TypeTest();
        printer.print(t1);
        TypeTestA t2 = new TypeTestA();
        printer.print(t2);
        TypeTestB t3 = new TypeTestB();
        printer.print(t3);
        System.out.println("....................");
        List<TypeTestB> tb1 = new ArrayList<TypeTestB>();
        tb1.add(t3);
        printer.print(tb1);
    }
}

现在可以打印主要方法:

T  
A  
B  
....................  
T

我应该怎么做才能打印以下内容?

T  
A  
B  
....................  
B

我想避免为每种可打印的类型编写如下的循环

   public void printTypeTestB(List<TypeTestB> t) {
        for (TypeTestB tt : t) {
            print(tt);
        }
    }

问题答案:

问题的根源在于,Java方法重载是在编译时根据方法参数表达式的声明类型来解决的。您的程序似乎正在尝试对不同的方法重载使用运行时分派。那在Java中根本行不通。

您在示例中使用泛型的事实有点让人讨厌。如果换成类型参数你有同样的问题<T>TypeTest



 类似资料:
  • 问题内容: 如果我要创建一个泛型的Java类,例如: 如何才能内部确定该类,最后变成什么“ T”? 我戳了一下Java API并使用了反射的东西,instanceof,getClass,.class等,但是我似乎无法做出决定。我觉得我已经接近了,只需要合并多个电话,但会持续很短的时间。 更具体地说,我试图确定是否用3种可能的类型之一实例化了该类。 问题答案: 我在他的一些项目中使用了与他在此处解释

  • 问题内容: 我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。 我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么? 提前致谢。 问题答案: 《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组 : 数组在两个重要方面不同于通用类型。首先,数组

  • 问题内容: 如何打印通用Java类型的类型? 反射?有什么花招吗? 问题答案: 可能会完成您的期望。

  • 问题内容: Java是否可以让类扩展泛型,以便您可以将方法注入通过代码传递的任何类中?(或者是否有其他方法可以使用Java将方法注入或重写到现有类中?) 我所说的“扩展通用类型”是这样的(类“ Textended GameObject”属于游戏,可能不会更改,并且是未知的,因为它是在运行时(从其他mods)加载到游戏中的): onTick由GameEngine调用,通过这种方式,我可以将每个现有的

  • 问题内容: 我有; 有没有一种(简单的)方法来检索列表的通用类型? 问题答案: 如果这些实际上是某个类的字段,那么你可以在反射的帮助下获得它们: 你还可以对参数类型和方法的返回类型执行此操作。 但是,如果它们处于你需要了解它们的类/方法的同一范围之内,那么就没有必要了解它们,因为你已经自己声明了它们。

  • 我不确定这在Java中是否可行。而且,我也不知道该在谷歌上查询什么。无论如何,我想要一个方法,它将一个类(接口或类)作为参数,并且该方法的返回类型是该类的一个实例。我不想事后重铸一个物体。 我不确定这个功能是否存在,或者语法是什么。假设我有一个名为XYZ的类,这是我的伪方法。 现在假设XYZ是某种通用语法。这在Java中可能吗?谢谢你的帮助。