这与how can I remove generic type from class using refactoring完全相反。
我想在接口中引入一个类型参数。它被广泛使用,因此手工操作不太实用。它也广泛用于import语句和JavaDoc,因此简单的全局字符串替换也不会很好。
编辑:
我确实尝试过“尽可能使用父类型”重构,但可以理解的是,在引入类型参数方面效果不佳。
答案 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
)。