Eclipse(或任何IDE)可以将类型参数引入现有类型

时间:2013-05-23 12:39:50

标签: java eclipse generics refactoring

这与how can I remove generic type from class using refactoring完全相反。

我想在接口中引入一个类型参数。它被广泛使用,因此手工操作不太实用。它也广泛用于import语句和JavaDoc,因此简单的全局字符串替换也不会很好。

编辑:

我确实尝试过“尽可能使用父类型”重构,但可以理解的是,在引入类型参数方面效果不佳。

1 个答案:

答案 0 :(得分:1)

在IntelliJ中,您可以使用“更改签名”重构。鉴于此代码:

public static void main(String[] args) {
    MyContainer container = new MyContainer("hello!");
    String val = container.get();
    System.out.println(val);
}

class MyContainer {
    final Object value;

    MyContainer(Object value) {
        this.value = value;
    }

    Object get() {
        return value;
    }
}

我右键点击MyContainer,然后选择了Refactor->更改签名...从这里,您可以引入类型参数T。您需要为T提供默认的具体类型。大多数情况下,为了保留现有代码,这将是Object;但这取决于你正在改变的班级。例如,如果使用MyContainer以上Number而不是Object,则新删除类型的等效值为Number。但在这种情况下你还需要声明T extends Number

当我完成此操作后,我会得到以下信息:

public static void main(String[] args) {
    MyContainer<Object> container = new MyContainer<Object>("hello!");
    String val = (String) container.get();
    System.out.println(val);
}

class MyContainer<T> {
    final Object value;

    MyContainer(Object value) {
        this.value = value;
    }

    Object get() {
        return value;
    }
}

现在您可以开始在T中使用MyContainer了,通过查看IntelliJ更改的文件,您可以开始查看需要查看的位置以开始填写正确的类型参数(因为所有自动生成的类型参数都是Object)。