2010-03-01 100 views
3

我正在尝试使用Java中的泛型,并考虑了此示例。使用非泛型实现覆盖泛型方法

如果我有ClassA<T>,我可以用引用具体类的子类覆盖它,例如ClassB extends ClassA<String>,然后在任何ClassA使用T的地方,ClassB可以使用String。

现在,忽视了前面的ClassAClassB,如果我有一个抽象ClassA,其中有一个通用的方法:

public <T> void doSomething(T data); 

有没有什么方法可以让我有一个ClassB与一个具体的类重写它,类似于前面的例子?我想出了一些可行的方法,即对类和方法进行参数化,但我想知道是否有其他方法。

class ClassA<T> { 
    public void doSomething(T data) {}; 
} 

的原因,我不希望把参数的类,因为它是唯一一个没有任何与该类型的方法,而一些子类甚至可能不希望在该方法中做任何事情,所以我如果不打算使用它,则不需要在该类中添加参数。

备注ClassA的所有子类都是匿名类,所以增加了乐趣。

+0

请参阅从@wowest答案从类似的问题 [重载泛型方法在Java中] [1] [1]:http://stackoverflow.com/questions/632033/overriding -java-generic-methods – Saasira 2012-05-26 21:36:40

回答

11

由于type erasure,这样的:

public <T> void doSomething(T data); 

真正含义:

public void doSomething(Object data); 

所以,不,不存在与更严格的参数类型覆盖的方式。

此外,在此代码:

class ClassA<T> { 
    public <T> void doSomething(T data) {}; 
} 

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

+0

感谢您的回答。这在Java中是一个奇怪的特性。如果所有方法类型都限制用户为Object,那么在类级别限制类型的意义何在?无论如何,这对我毫无意义。如果我想要一种方法是通用的,你所说的是是没有用的,除非在课堂上声明。 – Beezer 2016-07-18 15:42:03

2

总之,答案是否定的。如果你定义了一个具有泛型参数的方法,那么它的签名包含一个泛型,任何“覆盖”都必须与签名相匹配(包含泛型)。

总之,这真的是一个贫穷的使用泛型的,因为你写的是语义相同

public void doSomething(Object data) {} 

通用的位不买你多少,除非它被用来指示什么返回值如下:

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

但为什么要麻烦?真的有一个调用doSomething()的问题吗?

+0

男人,当我被打断时,有人张贴有效的相同答案,我讨厌它。 – 2010-03-01 18:23:32