ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在Java中返回嵌套的类类型

2019-05-22 14:00:23  阅读:257  来源: 互联网

标签:java oop nested-class 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?).

接下来,我放弃接口并尝试使用抽象基础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作为界面?

2)使用基类时,Class<?扩展X>真的是正确的方法吗? 3)如何从方法内部返回嵌套的B.MyTile类引用?不得不做新的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,oop,nested-class,class
来源: https://codeday.me/bug/20190522/1151994.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有