繁体   English   中英

实例化泛型类型

[英]Instantiating a generic type

我正在尝试将现有类转换为使用泛型,并且在转换构造函数时感到难过。

原始类是一个POJO,包含在基于文本的控制台游戏中从一个房间移动到另一个房间的逻辑。 从字面上看,它是一个类,它包含一些可触发动作的字符串触发器(例如,用户键入“向右走”),描述和指向新位置的指针。

该类的当前非泛型版本如下所示:

public class Navigation implements Serializable {
    private static final long serialVersionUID = 1L;
    private String trigger;
    private String description;
    private Location target;

    public Navigation() {
        this("", "", new Location());
    }

    public Navigation(String trigger, String description, Location target) {
        this.trigger = trigger;
        this.description = description;
        this.target = target;
    }

    // plus getters, setters, etc.
}

Location类是另一个描述位置的POJO。它是无关紧要的。)

我想扩展Navigation类,以便能够处理不是Location的目标。 我认为最好的方法是将Navigation类转换为使用泛型,所以我尝试了这个:

public class Navigation<T> implements Serializable {
    private static final long serialVersionUID = 2L;
    private String trigger;
    private String description;
    private T target;

    public Navigation() {
        this("", "", new T());
    }

    public Navigation(String trigger, String description, T target) {
        this.trigger = trigger;
        this.description = description;
        this.target = target;
    }

    // plus getters, setters, etc.
}

但是,这不会在此行编译this("", "", new T()); 因为T无法实例化。 是否可以在此上下文中实例化泛型类型对象?

你基本上有两个选择:

1.需要一个实例:

public Navigation(T t) {
    this("", "", t);
}

2.获取一个类实例:

public Navigation(Class<T> c) {
    this("", "", c.newInstance());
}

您可以使用工厂模式,但最终您将面临同样的问题,但只需将其推送到代码中的其他位置即可。

不,而且你想要的事实似乎是一个坏主意。 真的需要像这样的默认构造函数吗?

由于类型擦除,你不能做new T() 默认构造函数只能是

public Navigation() {
    this("", "", null);
}

您可以创建其他构造函数以提供触发器和描述的默认值。 你需要一个T的具体对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM