Java 中的动态泛型类型 [英] Dynamic Generic Typing in Java

查看:26
本文介绍了Java 中的动态泛型类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个使用泛型类型的类,例如

If I have a class using generic type such as

public class Record<T> {
    private T value;

    public Record(T value) {
        this.value = value;
    }
}

在设计时输入所有内容非常简单,如果我知道使用的所有类型,例如本例中的情况:

it is pretty straight forward to type everything during design time, if I know all types that are used such as it is the case in this example:

// I type explicitly
String myStr = "A";
Integer myInt = 1;
ArrayList myList = new ArrayList();

Record rec1 = new Record<String>(myStr);
Record rec2 = new Record<Integer>(myInt);
Record rec3 = new Record<ArrayList>(myList);

如果我从不知道类型的某处"获取对象列表,会发生什么?我如何分配类型:

What happens if I get a list of objects from "somewhere" where I don't know the type? How do I assign the type:

// now let's assume that my values come from a list where I only know during runtime what type they have

ArrayList<Object> myObjectList = new ArrayList<Object>();
    myObjectList.add(myStr);
    myObjectList.add(myInt);
    myObjectList.add(myList);

    Object object = myObjectList.get(0);

    // this fails - how do I do that?
    new Record<object.getClass()>(object);

推荐答案

Java 泛型不是 C++ 模板.

Java generics are not C++ Templates.

Java 泛型是编译时特性,而不是运行时特性.

Java generics are a compile time feature, not a run time feature.

这是Java泛型教程的链接.

这永远不能用于 Java:

new Record<object.getClass()>(object);

您必须使用多态(例如,每个对象实现一个已知接口)或 RTTI(instanceof 或 Class.isAssignableFrom()).

You must either use polymorphism (say, each object implements a known interface) or RTTI (instanceof or Class.isAssignableFrom()).

你可以这样做:

     class Record
     {
       public Record(String blah) { ... }
       public Record(Integer blah) { ... }
       ... other constructors.
     }

或者您可以使用构建器模式.

这篇关于Java 中的动态泛型类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆