作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在 Java 中试验泛型,并想到了这个例子。
如果我有ClassA<T>
,我可以用引用具体类的子类覆盖它,例如 ClassB extends ClassA<String>
,那么在 ClassA 使用 T 的任何地方,ClassB 都可以使用 String。
现在,忽略之前的 ClassA
和 ClassB
, 如果我有摘要 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/
我是一名优秀的程序员,十分优秀!