我有一个具有抽象 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
}
}
这里的问题是我在标记的行中得到“无法解析 MyTile”。所以我试图返回这个:
return new MyTile().getClass()
但是现在 Eclipse 告诉我:
Type mismatch: cannot convert from Class
<
capture#1-of ? extends B.MyTile>
to Class<
A.Tile>
我什至不确定顶部的 Eclipse 中是否存在错误(捕获#1?)。
接下来,我将放弃接口(interface)并尝试使用抽象基 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"
}
}
所以我基本上似乎有三个问题:
1) 是否有可能让它与 A.Tile 作为接口(interface)一起工作?
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;
}
}
更好的方法是使 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;
}
}
关于java - 在 Java 中返回嵌套类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/731131/