Java泛型-通配符
我是Java新手,很明显我对Java如何处理泛型有些误解,但阅读教程和搜索stackoverflow(至少到目前为止)并没有让我清楚地认识到,我怀疑我误用了通配符。作为一个提升者,我有C++背景,所以它如何处理模板可能是我如何处理这个问题的原因。 下面是我使用代表类继承的基本结构Java泛型-通配符,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,我是Java新手,很明显我对Java如何处理泛型有些误解,但阅读教程和搜索stackoverflow(至少到目前为止)并没有让我清楚地认识到,我怀疑我误用了通配符。作为一个提升者,我有C++背景,所以它如何处理模板可能是我如何处理这个问题的原因。 下面是我使用代表类继承的基本结构 abstract class PacketHeader{ // some stuff } class TypeOfPacketHeader extends PacketHeader{ // extende
abstract class PacketHeader{
// some stuff
}
class TypeOfPacketHeader extends PacketHeader{
// extended stuff
}
abstract class Packet<T extends PacketHeader>{
T mHeader;
// some methods treating T as a type of PacketHeader
// some abstract methods
}
class TypeOfPacket extends Packet<TypeOfPacketHeader>{
static TypeOfPacket obtain {
return new TypeOfPacket();
}
// overriden abstract functions that call specific TypeOfPacketHeader methods on mHeader
}
interface PacketParser<T extends Packet<? extends PacketHeader>>{
T obtainPacket();
void parse(T packet);
}
class ImplementedPacketParser implements PacketParser<TypeOfPacket>{
TypeOfPacket obtainPacket(){
return TypeOfPacket.obtain();
}
void parse(TypeOfPacket packet){
// code that relies on TypeOfPacket specific functions
}
}
并导致原始类型的警告。所以我试着
class User{
PacketParser<? extends Packet<? extends PacketHeader>> mParser;
User(PacketParser<? extends Packet<? extends PacketHeader>> parser){
mParser = parser;
}
void DoSomething(){
Packet<? extends PacketHeader> packet = parser.obtainPacket();
// do some stuff with the packet
mParser.parse(packet);
}
}
类用户{
PacketParser我对您的代码做了一些更改。它现在正在编译。请尝试使用此
abstract class PacketHeader {
// some stuff
}
class TypeOfPacketHeader extends PacketHeader {
// extended stuff
}
abstract class Packet<T extends PacketHeader> {
T mHeader;
// some methods treating T as a type of PacketHeader
// some abstract methods
}
class TypeOfPacket extends Packet<TypeOfPacketHeader> {
static TypeOfPacket obtain() {
return new TypeOfPacket();
}
// overriden abstract functions that call specific TypeOfPacketHeader
// methods on mHeader
}
interface PacketParser<T extends Packet<? extends PacketHeader>> {
T obtainPacket();
void parse(T packet);
}
class ImplementedPacketParser implements PacketParser<TypeOfPacket> {
public TypeOfPacket obtainPacket() {
return TypeOfPacket().obtain();
}
private TypeOfPacket TypeOfPacket() {
// TODO Auto-generated method stub
return null;
}
public void parse(TypeOfPacket packet) {
// code that relies on TypeOfPacket specific functions
}
}
在您的用户
代码中,编译器不知道?扩展了packetim,他们不喜欢泛型来描述一切,因为这是一条很短的混淆之路。请尽量保持它尽可能简单,并且它更有可能有意义。;)好吧,至少对我来说,似乎为我想我理解现在发生的事情,我很感激你指出隐含的约束。我希望由于数据包是从mParser获得的,编译器能够理解它我们已经完成了,但这可能是太多的希望了(我肯定不想尝试编写能够做到这一点的编译器…)现在似乎已经实现了所有这些,并且在编译时没有错误或警告。必须在上面的层上做一些调整,但不是太糟糕。谢谢捆绑包!没问题,很高兴我能提供帮助!
abstract class PacketHeader {
// some stuff
}
class TypeOfPacketHeader extends PacketHeader {
// extended stuff
}
abstract class Packet<T extends PacketHeader> {
T mHeader;
// some methods treating T as a type of PacketHeader
// some abstract methods
}
class TypeOfPacket extends Packet<TypeOfPacketHeader> {
static TypeOfPacket obtain() {
return new TypeOfPacket();
}
// overriden abstract functions that call specific TypeOfPacketHeader
// methods on mHeader
}
interface PacketParser<T extends Packet<? extends PacketHeader>> {
T obtainPacket();
void parse(T packet);
}
class ImplementedPacketParser implements PacketParser<TypeOfPacket> {
public TypeOfPacket obtainPacket() {
return TypeOfPacket().obtain();
}
private TypeOfPacket TypeOfPacket() {
// TODO Auto-generated method stub
return null;
}
public void parse(TypeOfPacket packet) {
// code that relies on TypeOfPacket specific functions
}
}
class User{
private PacketParser mParser;
User(PacketParser parser) {
mParser = parser;
}
void DoSomething() {
Packet packet = mParser.obtainPacket();
// do some stuff with the packet
mParser.parse(packet);
}
}
class User<T extends Packet<?>> {
PacketParser<T> mParser;
User(PacketParser<T> parser){
mParser = parser;
}
void DoSomething(){
T packet = parser.obtainPacket();
// do some stuff with the packet
mParser.parse(packet);
}
}
// and then when instantiating your User, specify the packet type:
new User<TypeOfPacket>(new ImplementedPacketParser())
// ? is implicitly constrained to "extends PacketHeader" because of
// the way Packet's generic is defined
interface PacketParser<T extends Packet<?>> {