Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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_Parameters_Type Erasure - Fatal编程技术网

Java 如何用泛型参数重写具有对象参数的方法?

Java 如何用泛型参数重写具有对象参数的方法?,java,generics,parameters,type-erasure,Java,Generics,Parameters,Type Erasure,我要重写具有类型为Object的参数的方法: public void setValue(Object value) { // ... } 并使该参数具有泛型类型T: @Override public void setValue(T value) { super.setValue(value); } 我如何在Java中做到这一点 在Eclipse中,我会遇到以下错误: Multiple markers at this line - The type parameter T is

我要重写具有类型为
Object
的参数的方法:

public void setValue(Object value) {
    // ...
}
并使该参数具有泛型类型
T

@Override
public void setValue(T value) {
    super.setValue(value);
}
我如何在Java中做到这一点

在Eclipse中,我会遇到以下错误:

Multiple markers at this line
- The type parameter T is hiding the type T
- Name clash: The method setValue(T) of type TextField<T> has the 
 same erasure as setValue(Object) of type JFormattedTextField but does not 
 override it
- The method setValue(T) of type TextField<T> must override or 
 implement a supertype method
此行有多个标记
-类型参数T正在隐藏类型T
-名称冲突:TextField类型的方法setValue(T)具有
与JFormattedTextField类型的setValue(对象)相同的擦除,但没有
覆盖它
-TextField类型的方法setValue(T)必须重写或
实现一个超类型方法

不能使重写方法接受比其重写的方法更窄的类型

如果可以,可以执行以下操作:

class A {
    public setValue(Object o) {…}
}

class B<T> extends A {
    @Override
    public setValue(T o) {…};
}

A a = new B<String>(); // this is valid
a.setValue(new Integer(123)); // this line would compile, but make no sense at runtime 
A类{
公共设置值(对象o){…}
}
B类扩展了A类{
@凌驾
公共设置值(TO){…};
}
A=新的B();//这是有效的
a、 设置值(新整数(123));//这一行可以编译,但在运行时没有意义
使用:

publicsvoidsetvalue(to){…};

那么
a.setValue(新整数(123))就没有问题了。只需定义为
aaa=newb()
您可以通过用所需的类替换
对象
使其更窄。

这可能就是您要寻找的。您不能使重写方法接受比它重写的方法更窄的类型,句号。但是为什么
a.setValue(新整数(123))工作,因为
Integer
继承自
Object
?@Jonas:因为变量
a
持有类型为
B
的对象,而
B
中的重写方法将被调用。变量的类型与方法绑定无关,它存储的对象的类型与此无关。这不起作用:
此行有多个标记-标记“public”上的语法错误,删除此标记-TextField类型的方法setValue(t)必须重写或实现超类型方法-名称冲突:方法setValue(t)TextField类型的具有与JFormattedTextField类型的setValue(对象)相同的擦除,但不覆盖它
Try
TextField
No,它不起作用。你的方法签名是错误的。它应该返回
void
。对于我来说,使用而不是简单的帮助+1.
<T extends Object> public void setValue(T o) {…};