繁体   English   中英

Java枚举实现与Class的接口 <T> 返回类型

[英]Java enum implements interface with Class<T> return type

好,很好

这是一个用返回“原始类型”的方法实现接口的枚举,该方法在接口中的getCaste()方法上给我警告。

public enum Thing implements HasCaste {

    Type1 {
        @Override
        public Class getCaste() {
            return String.class;
        }
    };
}

interface HasCaste {
    public Class getCaste();
}

如果我将接口的方法更改为:

public <T> Class<T> getCaste();

它变为对Type1的方法签名的未经检查的警告。 如果然后将Type1.getCaste()的签名更改为:

public <T> Class<T> getCaste()

则返回具有不兼容的类型错误,因为无法将Class<String>转换为Class<T> 如果然后将返回值更改为(Class<T>) String.class ,则会收到未经检查的强制转换警告。

有没有办法做到这一点而没有警告?

编辑:

抱歉,我没有在前面添加它,但是这样做会很好:

  , Type2 {
        @Override
        public Class getCaste() {
            return Integer.class;
        }
    };

正如我刚才问到的由Radiodef链接问题所确定的那样 ,您不能使用enum来做到这一点,只能通过实际上是一个类的模拟枚举来做到这一点。

public abstract class Thing<T> implements HasCaste<T> {
    public static final Thing<String> Type1 = new Thing<String>() {
        @Override
        public Class<String> getCaste() {
            return String.class;
        }
    };
    public static final Thing<Integer> Type2 = new Thing<Integer>() {
        @Override
        public Class<Integer> getCaste() {
            return Integer.class;
        }
    };

    private Thing() {
    }
}

如您所见,这不是enum 仅使用enum是不可能的,因为枚举不能具有类型参数。

ps:如果您觉得这有帮助,请查看Radiodef的答案以获得更完整的解释,毕竟我是从他那里学到的:)

您可以不指定返回的类的type参数:

public enum Thing implements HasCaste {

    Type1 {
        @Override
        public Class<String> getCaste() {
            return String.class;
        }
    }, Type2 {
        @Override
        public Class<Integer> getCaste() {
            return Integer.class;
        }
    };
}

interface HasCaste {
    public Class<?> getCaste();
}

假设您要定义几个不同的“类型化”枚举常量,则可以这样做:

interface HasCaste {
    public Class<?> getCaste();
}

public enum Thing implements HasCaste<?> {

    Type1(String.class),
    Type2(Integer.class);

    public final Class<?> clazz;

    private Thing(Class<?> clazz) {
        this.clazz = clazz;
    }

    @Override
    public Class<?> getCaste() {
        return clazz;
    }
}

然后,将输入推迟到getCaste的将来使用中。 枚举的主要特征是封闭值域。 必须列出类中所有可能的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM