Vic*_*tor 9 java generics parameters
我会问一个非常简短的问题,并希望有人可以帮助我找到解决方案.它涉及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);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
public enum Getter
{
BillItemsSize {
@Override
public Integer get (DesiredClass entity) { // no cast at all
// do things
}
};
public abstract <T,K> T get (K entity);
}
Run Code Online (Sandbox Code Playgroud)
java编译器叫我这样:
<anonymous datasource.db.Getter$1> is not abstract and does not override abstract method <T,K>get(K) in Getter
Run Code Online (Sandbox Code Playgroud)
嗯,就是这种情况.在此先感谢所有人!希望它在将来帮助别人!
PD:这不是枚举类型的问题..它发生在类层次结构中.因此,不要责备指责emuns ...我试过这个,但也不起作用.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于泛型参数
我们可以制定一个通用规则声明,对于"泛型参数"(那些类型是通用的),方法签名中隐式采用的类型等于该泛型的上限,可以是Object,如果没有指定,或者更多如果使用上限,则使用特定子类(例如,T extends String).
对于泛型返回类型
使用特定返回类型覆盖泛型方法没有问题,只要返回类型是覆盖返回类型的子类型.首先是什么样的返回类型?好吧,它碰巧是对象.默认情况下,编译器假定(在方法签名中)泛型类型为Object类型.
所以我们必须要知道,任何具有泛型返回类型的方法实际上都具有Object返回类型.然后,如果在任何子类中该方法被覆盖并且我们改变了返回类型,表明返回另一种类型,则没有问题.因为,除了该方法将返回另一个类的对象之外,返回的该对象将不可避免地成为Object类的子类,并且没有问题会覆盖具有与原始类型不同的返回类型的方法,只要它是原始的子类型.称为协变返回类型的技术允许我们做这样的事情.
public abstract class SuperClass
{
public abstract <T> T operation ();
}
public class SubClass extends SuperClass
{
@Override
public Chair operation()
{
//bla bla
}
}
Run Code Online (Sandbox Code Playgroud)
同时在代码的另一部分......
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();
}
Run Code Online (Sandbox Code Playgroud)
感谢所有帮助清除这一点的人!
JB *_*zet 11
public abstract <T,K> T get (K entity);
Run Code Online (Sandbox Code Playgroud)
是一种可以将任何东西作为参数的方法,并且允许返回任何东西.
覆盖它
public Integer get (DesiredClass entity)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为您将可以传递给方法的参数类型限制为DesiredClass,从而打破了Liskov原则.
没有泛型就更容易理解.假设您在类Bar中有一个抽象方法:
public abstract void fillRecipient(Recipient r);
Run Code Online (Sandbox Code Playgroud)
并尝试在SubBar中覆盖它
public void fillRecipient(Glass glass) {
}
Run Code Online (Sandbox Code Playgroud)
如果以上代码合法,以下代码会怎么做?
Bar bar = new SubBar();
bar.fillRecipient(new Mug());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32502 次 |
| 最近记录: |