java - 用非泛型实现覆盖泛型方法

标签 java generics

我正在 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 的所有子类是匿名类,因此增加了乐趣。

最佳答案

感谢type erasure ,这个:

public <T> void doSomething(T data);

真正的意思是:

public void doSomething(Object data);

所以不,没有办法用更严格的参数类型来覆盖。

同样在这段代码中:

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

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

关于java - 用非泛型实现覆盖泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357824/

相关文章:

java - 强制泛型方法的两个参数具有相同的具体类型

java - 使用无限通配符等将 Scala 类型的集合转换为 Java Collection<?>

java - glTexImage3D - 无效操作

java - AOP in spring 切面警告

java - 无法将 BOOLEAN 列添加到我的 Derby 数据库中的表中

ios - 为 objective-c 中的方法传递未知类型的参数,可能吗?

generics - 过滤通用类型,无需反射或转换

Java,将键盘输入值与file.txt值进行比较

java - 在不同的类层次结构中重用相同的类

java 泛型 : bounded wildcard upsetting eclipse