Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中实现泛型方法_Java_Generics - Fatal编程技术网

如何在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;
    }
}