Java Eclipse(或任何IDE)能否向现有类型引入类型参数

Java Eclipse(或任何IDE)能否向现有类型引入类型参数,java,eclipse,generics,refactoring,Java,Eclipse,Generics,Refactoring,这是完全相反的 我想向接口引入一个类型参数。它被广泛使用,所以手工操作不太实用。它还广泛应用于import语句和JavaDoc中,因此简单的全局字符串替换也不能很好地工作 编辑: 我确实尝试过“在可能的情况下使用父类型”重构,但在引入类型参数方面效果不太好,这是可以理解的。在IntelliJ中,您可以使用“更改签名”重构。鉴于此代码: public static void main(String[] args) { MyContainer container = new MyContai

这是完全相反的

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

编辑:


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

在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,然后选择重构->更改签名。。。从这里,可以引入类型参数
T
。您需要为
T
指定默认的具体类型。大多数情况下,为了保留现有代码,这将是
对象
;但这取决于你换的班级。例如,如果上面的
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;
    }
}
publicstaticvoidmain(字符串[]args){
MyContainer容器=新的MyContainer(“你好!”);
String val=(String)container.get();
系统输出打印项次(val);
}
类霉菌容器{
最终目标值;
MyContainer(对象值){
这个值=值;
}
对象get(){
返回值;
}
}

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

我刚刚在IntelliJ 12.1.3中尝试过这一点。当我在一个界面上使用shift-F6并将其从
Foo
重命名为
Foo
时,IDE给出了一个错误。但是,如果您在键入
Foo
后直接退出IDEA,并且不按enter键,它至少会更改代码中的所有接口引用。谢谢!我还发现,您可以将
放在默认值框中,这正好满足我的需要。