通用类混淆

时间:2015-05-28 14:42:05

标签: java generics

我有2个抽象类:ScreenWorld。两个实现IState。 所以我想为具体类使用泛型类型以绕过类转换。

public abstract class World<S extends Screen> implements IState{/*body*/}

public abstract class Screen<W extends World> implements IState{/*body*/}

public final class SomeWorld extends World<SomeScreen> {}

public final class SomeScreen extends Screen<SomeWorld> {}

第二个抽象类没有错误但是警告我告诉我我缺少泛型参数。所以我暂时保留警告

public abstract class World<S extends Screen<?>> implements IState{/*body*/}

public abstract class Screen<W extends World<?>> implements IState{/*body*/}

我是以正确的方式使用通用还是更好的解决方案?

编辑:假设在SomeWorld类中有doSomething()方法,它不在抽象的World方法中声明。如何在不进行转换的情况下在某个屏幕实例中调用world.doSomething():     ((SomeWorld)世界).doSomething()

1 个答案:

答案 0 :(得分:0)

感谢您的详细说明。

如果您的变量(或表达式)的类型为World,并且您想要调用SomeWorld中定义的方法,则只有两个选项:

演员:((SomeWorld) world).doSomething();

反思:world.getClass().getMethod("doSomething").invoke(world);

Java不允许您直接引用对象的字段或方法,这些字段或方法未在编译时为编译器为该对象推导出的任何类型中声明。

Casting允许您将表达式更改为具有所需类型的表达式,因此满足编译器的要求,但它在运行时提高了ClassCastException的可能性。

反射允许您在无法进行投射时使用这些方法。 (例如,当你不知道对象是什么类型但你想要调用它的xyz方法时,如果它有一个)。在这种情况下可能会抛出各种异常。

顺便说一句,WorldScreen之间的循环类型依赖关系是很少见的,因此在技术上不正确,因此非常怀疑。