mir*_*e2k 5 java oop class nested-class
我有一个具有抽象getType()方法的基类.我希望子类能够实现此方法并提供要使用的实际类.
在代码中,类似于以下内容:
public abstract class A {
public static interface Tile;
protected abstract Class<Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Class<A.Tile> getTileClass() {
MyTile t = new MyTile(); // WORKS
return MyTile; // ERROR HERE
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我在标记的行中得到"MyTile无法解析".所以我试图回复这个:
返回新的MyTile().getClass()
但现在Eclipse告诉我:
类型不匹配:无法转换类
<捕获#1-of?将B.MyTile扩展>到Class<A.Tile>
我甚至不确定Eclipse中是否有可能存在错误(捕获#1?).
接下来,我放弃接口并尝试使用抽象基础Tile类.在Eclipse的帮助下,我最终得到了以下似乎编译的代码:
public abstract class A {
public static abstract class Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile exends A.Tile { }
@Override
protected abstract Class<? extends A.Tile> getTileClass() {
return new MyTile().getClass(); // WORKS
return MyTile; // "Cannot be resolved"
}
}
Run Code Online (Sandbox Code Playgroud)
所以我基本上似乎有三个问题:
1)是否可以使用A.Tile作为界面?
2)使用基类时,Class<? extends X>真的是正确的方法吗?
3)如何从方法内部返回嵌套的B.MyTile类引用?不得不做new MyTile().getClass()对不对,可以吗?
泛型和协变类型重写不能很好地协同工作.您必须显式声明getTileClass()作为返回可以作为A.Tile 的子类的类.
您还可以使用MyTile.class访问MyTile的类对象,而无需对其进行实例化.
试试这个:
public abstract class A {
public static interface Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected Class<MyTile> getTileClass() {
return MyTile.class;
}
}
Run Code Online (Sandbox Code Playgroud)
更好的是制作A通用.您仍然必须在类类型定义中使用extends,但您可以更具体一些:
public abstract class A<T extends A.Tile> {
public static interface Tile;
protected abstract Class<? extends T> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected Class<MyTile> getTileClass() {
return MyTile.class;
}
}
Run Code Online (Sandbox Code Playgroud)