使用非generics实现覆盖generics方法
我正在尝试Java中的generics,并想到了这个例子。
如果我有ClassA
,我可以用引用具体类的子类覆盖它,例如ClassB extends ClassA
,然后ClassA使用T,ClassB可以使用String。
现在,忽略以前的ClassA
和ClassB
,如果我有一个抽象的ClassA
,它有一个通用的方法:
public void doSomething(T data);
有没有什么方法可以让ClassB
用一个具体类覆盖它,类似于前面的例子? 我想出了一些有用的东西,即参数化类和方法,但我想知道是否还有另一种方法。
class ClassA { public void doSomething(T data) {}; }
我不想将参数放在类中的原因是因为它只有一个方法可以对该类型执行任何操作,而某些子类甚至可能不想在该方法中执行任何操作,因此我不需要放置如果它不打算使用它,则该类中的参数。
注意 : ClassA
所有子类都是匿名类,因此增加了乐趣。
感谢类型擦除 ,这个:
public void doSomething(T data);
真的意思是:
public void doSomething(Object data);
所以不,没有办法用更严格的参数类型覆盖。
也在这段代码中:
class ClassA { public void doSomething(T data) {}; }
类名中的type参数和方法中的type参数实际上是不同的参数。 这就像声明一个与更高范围内的变量同名的局部变量。 您可以在ClassA
的实例上调用doSomething(123)
,因为第二个T
是方法的本地。
简而言之,答案是否定的。 如果使用generics参数定义方法,则其签名包含generics,并且任何“覆盖”必须与签名匹配(包含generics)。
无论如何,这对于generics来说真的很糟糕,因为你所写的内容在语义上是相同的
public void doSomething(Object data) {}
除非用于指示返回值是什么,否则通用位不会给你带来太大的收益,如:
public T doSomething(T data) {}
但为什么要这么麻烦? 是否真的存在一个通常调用doSomething()的问题?