java - 在 Java 中返回嵌套类类型

标签 java class oop 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
    }
}

这里的问题是我在标记的行中得到“无法解析 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/

相关文章:

python - Python 基类是什么?

html - 在导航中显示 'active' 选项卡

php - 如何从另一个类方法 PHP 中捕获异常

java - 如何将调用方法的对象作为参数传递给 Java 中的方法?

java - 远程调试在 Glassfish 中运行的 Java Web 应用程序

java - 无法以编程方式执行登录

java - jpa 标准比较两个字符串而不考虑空格

ruby-on-rails - 具有相同名称的类和模块 - 如何选择一个或另一个?

javascript - 我怎样才能合并我的 JavaScript 文件并仍然让我的回调等待就绪状态?

java - 无法解析方法askCompactPermission