如何在java中实现泛型方法
我需要覆盖此方法:如何在java中实现泛型方法,java,generics,Java,Generics,我需要覆盖此方法: @Override public <T> T convertValue(Object object, Class<T> clazz) 所以现在我真的很困惑。有人能给我解释一下,并举例说明如何返回一些值吗?T是一个类型参数。它是类型的“占位符” 您得到的错误是因为您正在使用字符串类型参数隐藏字符串类型。您需要删除类型参数才能正确解析类型 另外,请注意,即使这样,您也无法重写该方法,因为 @Override public S
@Override
public <T> T convertValue(Object object, Class<T> clazz)
所以现在我真的很困惑。有人能给我解释一下,并举例说明如何返回一些值吗?
T
是一个类型参数。它是类型的“占位符”
您得到的错误是因为您正在使用字符串类型参数隐藏字符串类型。您需要删除类型参数才能正确解析类型
另外,请注意,即使这样,您也无法重写该方法,因为
@Override
public String convertValue(Object object, Class<String> clazz){
return "a";
}
@覆盖
公共字符串值(对象、类clazz){
返回“a”;
}
具有与A.convertValue()
不兼容的类型签名
这是因为,简单地说,Java要求您应该能够在任何可以使用A.convertValue()
的地方使用B.convertValue()
的重写实现,而不会出现编译错误。因此,您应该保留类型参数,正如JB Nizet正确建议的那样
最后,人们强烈怀疑您可能不理解方法convertValue
是关于什么的。再次,请阅读JB Nizet的答案,因为他提供了直观的解释,并确保阅读基础知识
多亏了类型推断
如果必须重写它,那么方法实现必须遵守基本方法的约定。只有clazz参数为String.class
时,才能返回字符串。如果clazz不是String.class,则始终返回“a”并引发异常的实现将是,例如:
@Override
public <T> T convertValue(Object object, Class<T> clazz) {
if (clazz == String.class) {
return (T) "a";
}
else {
throw new IllegalArgumentException("I only support String, sorry");
}
}
@覆盖
公共转换值(对象,类clazz){
if(clazz==String.class){
返回(T)“a”;
}
否则{
抛出新的IllegalArgumentException(“我只支持字符串,对不起”);
}
}
重写返回类型的规则应与超类中原始重写方法中声明的返回类型相同或是其子类型
所以不可能在子类中用非泛型方法重写泛型方法,除非在如下扩展时特别声明T的类型
class A <T> {
public T method(T a){
return a;
}
}
class B extends A<String> {
@Override
public String tell(String a){
return a;
}
}
A类{
公共T法(TA){
返回a;
}
}
B类扩展了A类{
@凌驾
公共字符串告诉(字符串a){
返回a;
}
}
但这对下面这样的超级阶级来说是行不通的;其中,T在方法级别内局部定义;而子类并不能控制它。子类将按照覆盖规则失败
class A {
public <T> T method(T a){
return a;
}
}
A类{
公共T法(TA){
返回a;
}
}
另请阅读您是否尝试过删除诸如public T convertValue(Object-Object,Class-clazz)之类的内容?@KanagaveluSugumar我无法删除,因为我超出了方法的范围。如果我删除它,那么它就不会被重写。你的超类在它的签名中有这个吗?没有,只有这个方法
String s = foo.<String>convertValue(someObject, String.class);
String s = foo.convertValue(someObject, String.class);
@Override
public <T> T convertValue(Object object, Class<T> clazz) {
if (clazz == String.class) {
return (T) "a";
}
else {
throw new IllegalArgumentException("I only support String, sorry");
}
}
class A <T> {
public T method(T a){
return a;
}
}
class B extends A<String> {
@Override
public String tell(String a){
return a;
}
}
class A {
public <T> T method(T a){
return a;
}
}