【发布时间】:2012-12-10 00:59:39
【问题描述】:
它是关于 java 中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。 我想我在图片中遗漏了一些东西来让它工作。
问题是这样的……
这是工作:
public enum Getter
{
BillItemsSize {
@Override
public Integer get (Object entity) {
DesiredClass ref = (DesiredClass ) entity; // "Old time" cast
// do things...
}
};
public abstract <T,K> T get (K entity);
}
这不起作用:
public enum Getter
{
BillItemsSize {
@Override
public Integer get (DesiredClass entity) { // no cast at all
// do things
}
};
public abstract <T,K> T get (K entity);
}
java 编译器这样喊我:
<anonymous datasource.db.Getter$1> is not abstract and does not override abstract method <T,K>get(K) in Getter
嗯,情况就是这样。 在此先感谢大家! 希望它在未来对其他人有所帮助!。
P.D:这不是枚举类型的问题。它发生在类层次结构中。所以不要费心去责怪枚举,我试过了,但没有用。
public abstract class SuperClass
{
public abstract <T,E> T pepe (E e);
}
public class SubClass extends SuperClass
{
@Override
public Integer pepe(DesiredClass e) // fails...
{
return null;
}
}
更新:
对于泛型参数
我们可以制定一个通用规则声明,对于“泛型参数”(其类型是泛型的),方法签名中隐式采用的类型等于该泛型的上限,可以是 Object,如果没有指定,或更具体的子类,如果使用了上限(例如 T 扩展字符串)。
对于泛型返回类型
用特定返回类型覆盖泛型方法没有问题,只要返回类型是被覆盖返回类型的子类型。首先返回类型是什么?好吧,它恰好是对象。默认情况下,编译器假定(在方法签名中)泛型类型为 Object 类型。
所以我们必须知道,任何具有通用返回类型的方法实际上都具有 Object 返回类型。 然后,如果在任何子类中该方法被覆盖并且我们改变他的返回类型声明返回另一种类型,就不会有问题。因为,除了该方法将返回另一个类的对象之外,返回的对象将不可避免地是 Object 类的子类,并且只要它是原始的子类型,覆盖具有不同返回类型的方法就没有问题。 .称为协变返回类型的技术允许我们做这样的事情。
public abstract class SuperClass
{
public abstract <T> T operation ();
}
public class SubClass extends SuperClass
{
@Override
public Chair operation()
{
//bla bla
}
}
同时在代码的另一部分...
void main ()
{
SubClass sb = new SubClass();
Chair chair = sb.operation ();
// the chair type can be easely replaced by super type (like Object)
Object object = sb.operation();
}
感谢所有帮助解决这个问题的人!
【问题讨论】:
-
<T,K> get (K)在第二种情况下K === Object没有实现。
标签: java generics parameters