Java 用非泛型实现重写泛型方法

Java 用非泛型实现重写泛型方法,java,generics,Java,Generics,我正在用Java做泛型的实验,想到了这个例子 如果我有ClassA,我可以用引用具体类的子类覆盖它,比如ClassB扩展ClassA,那么ClassA使用T的任何地方,ClassB都可以使用字符串 现在,忽略前面的ClassA和ClassB,如果我有一个抽象ClassA,它有一个通用方法: public <T> void doSomething(T data); 我不想把参数放在类中的原因是因为只有一个方法可以用这种类型做任何事情,有些子类甚至不想在这种方法中做任何事情,所以如果它

我正在用Java做泛型的实验,想到了这个例子

如果我有
ClassA
,我可以用引用具体类的子类覆盖它,比如
ClassB扩展ClassA
,那么ClassA使用T的任何地方,ClassB都可以使用字符串

现在,忽略前面的
ClassA
ClassB
,如果我有一个抽象
ClassA
,它有一个通用方法:

public <T> void doSomething(T data);
我不想把参数放在类中的原因是因为只有一个方法可以用这种类型做任何事情,有些子类甚至不想在这种方法中做任何事情,所以如果它不打算使用它,我不需要把参数放在类中

注意:ClassA的所有子类都是匿名类,因此这增加了乐趣。

由于以下原因:

因此,没有一种方法可以使用更严格的参数类型进行重写

在本规范中:

class ClassA<T> {
    public <T> void doSomething(T data) {};
}
A类{
公共无效剂量测定(T数据){};
}

类名中的类型参数和方法中的类型参数实际上是不同的参数。这就像在更高的范围内声明一个与变量同名的局部变量。您可以对
ClassA
的实例调用
doSomething(123)
,因为第二个
T
是该方法的本地实例。

简而言之,答案是否。如果您使用泛型参数定义一个方法,则其签名包含泛型,并且任何“覆盖”都必须与签名(包含泛型)匹配

无论如何,这确实是泛型的一个糟糕的用法,因为您所写的在语义上与

public void doSomething(Object data) {}
通用位不会给您带来太多好处,除非它用于指示返回值,如:

public <T> T doSomething(T data) {}
public T doSomething(T data){

但是为什么要麻烦呢?泛型调用doSomething()真的有问题吗?

伙计,我讨厌有人在我被打断时发布相同的答案。请参阅@wowest的类似问题的答案[Overriding Generic Methods in Java][1][1]:谢谢你的回答。这在Java中是一个非常奇怪的特性。如果方法类型所做的只是将用户限制为对象,那么在类级别限制类型有什么意义?这对我来说毫无意义。如果我希望一个方法是泛型的,那么你所说的是没有用的……除非在类级别声明了。
class ClassA<T> {
    public <T> void doSomething(T data) {};
}
public void doSomething(Object data) {}
public <T> T doSomething(T data) {}