考虑以下代码
class AbstractPacket {
}
class ConcretePacket extends AbstractPacket {
}
abstract class AbstractPacketReader<P extends AbstractPacket> {
P read() {
return doRead();
}
protected abstract P doRead();
}
class ConcretePacketReader extends AbstractPacketReader<ConcretePacket> {
@Override
protected ConcretePacket doRead() {
return new ConcretePacket();
}
}
public class Example {
public static void main(String[] args) {
ConcretePacketReader reader = new ConcretePacketReader();
ConcretePacket packet = reader.read(); // Unchecked/unconfirmed cast here
System.out.println(packet);
}
}
为什么FindBugs会抱怨未经检查的演员?当然,ConcretePacketReader
扩展AbstractPacketReader<ConcretePacket>
后,其read
函数应返回ConcretePacket
,并且不需要强制转换。当然,由于类型擦除,实际上有一个强制转换,但这是编译器检查安全性的一种强制类型,因此FindBugs不应该关心它。
它是FindBugs中的一个错误还是我错过了一些荒谬简单但又不完全明显的东西?