我有一个接口和一个值类,如下所示:

public interface ITest {

T1 test(OtherClass client);

}

基本上,它说子类型必须实现返回T1的方法测试,无论实现子类型中的内容是什么.

其他类:

public class OtherClass {

public T contents;

}

但是,当我想编写实现测试的子类型并只返回它获得的客户端实例时,会出现编译错误.我想要的是统一T1和T2:

public class Test implements ITest {

@Override

public T1 test(OtherClass client) { // compile error

return client.contents;

}

}

有什么办法可以让这个班上课吗?

解决方法:

< T1>基本上告诉任何类“您选择T1将是哪种类型!”.这意味着在这种情况下,< T1>和OtherClass< T1>引用相同的类型,而返回类型T1引用该类的T1.如果您重命名一个,您将看到错误:

@Override

public T1 test(OtherClass client) {

return client.contents; //you can't do that without casting OtherClassType to T1

}

如果您无法编辑ITest接口,则编译的唯一方法是强制转换,但是您需要确保在执行强制转换之前可以进行强制转换(因为OtherClass可以返回任何类型,不一定是T1的子类.

编辑:编译器不允许这样做的确切原因是因为您实际上限制了测试方法只接受某些类型,而它覆盖的方法则允许任何类型.

标签:generics,java