Java 泛型类混淆
我有两个抽象类:Java 泛型类混淆,java,generics,Java,Generics,我有两个抽象类:Screen和World。这两个工具都实现了IState。 所以我想对具体类使用泛型类型,以便绕过类转换 public abstract class World<S extends Screen> implements IState{/*body*/} public abstract class Screen<W extends World> implements IState{/*body*/} public final class SomeWorl
Screen
和World
。这两个工具都实现了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> {}
公共抽象类世界实现IState{/*body*/}
公共抽象类屏幕实现IState{/*body*/}
公共最终类SomeWorld扩展世界{}
公共最终类SomeScreen扩展了Screen{}
在第二个抽象类中没有错误,只有一个警告告诉我缺少泛型参数。所以我暂时保留了这个警告
public abstract class World<S extends Screen<?>> implements IState{/*body*/}
public abstract class Screen<W extends World<?>> implements IState{/*body*/}
公共抽象类世界>实现IState{/*body*/}
我是以正确的方式使用泛型还是有更好的解决方案
编辑:假设在SomeWorld类中有doSomething()方法,该方法没有在抽象世界方法中声明。我如何在屏幕实例中调用world.doSomething()而不强制转换:
((SomeWorld)world)doSomething()感谢您的详细介绍 如果您有一个类型为
World
的变量(或表达式),并且希望调用SomeWorld
中定义的方法,则只有两个选项:
演员:((SomeWorld)world.doSomething()代码>
反射:world.getClass().getMethod(“doSomething”).invoke(world)代码>
Java不允许您直接引用对象的字段或方法,这些字段或方法没有在编译时编译器为该对象推导的任何类型中声明
强制转换允许您将表达式更改为具有所需类型的表达式,因此可以满足编译器的要求,但它会增加运行时出现ClassCastException
的可能性
反射允许您在无法进行强制转换时使用这些方法。(例如,当您不知道对象是什么类型,但希望调用其xyz
方法(如果有)时)。在这种情况下可能会引发各种异常
顺便说一句,您在World
和Screen
之间的循环类型依赖是非常罕见的,因此非常可疑,尽管在技术上并不错误。这里似乎不需要泛型,您的确切意思是“所以我想对具体类使用泛型类型,以绕过类强制转换。”你确定你想要在你的类设计中有这样的循环吗?如果没有更多关于你想要实现什么的细节,你就不能说你是否正确地使用了泛型。请详细说明,特别是屏幕
和世界
之间的关系(为什么您需要每种类型依赖于另一种)。谢谢您的回答。这就是为什么我要使用泛型类型