泛型不适用于返回类型

发布于 2024-09-07 06:23:53 字数 711 浏览 2 评论 0原文

为什么 java 不允许以下泛型返回类型:

public <T extends Enum<T> & MyInterface> Class<T> getEnum() {
    return MyEnum.class;
}

虽然以下方法确实有效:

public <T extends Enum<T> & MyInterface> Class<T> getEnum(Class<T> t) {
    return t;
}

getEnum(MyEnum.class); 

MyEnum 是一个实现接口 MyInterface 的枚举。

为什么我不允许返回 MyEnum.class

编辑:

我需要这个,因为函数 getEnum() 位于接口中。它可以定义如下:

@Override
public Class<MyEnum> getEnum() {
    return MyEnum.class;
}

但是,接口方法的返回类型是什么,以允许既是枚举又实现 MyInterface 的类的任何 Class 对象?

How come java doesn't allow the following generic return type:

public <T extends Enum<T> & MyInterface> Class<T> getEnum() {
    return MyEnum.class;
}

While the following does work:

public <T extends Enum<T> & MyInterface> Class<T> getEnum(Class<T> t) {
    return t;
}

getEnum(MyEnum.class); 

MyEnum is an enumaration that implements the interface MyInterface.

Why am I not allowed to return MyEnum.class?

EDIT:

I need this because the function getEnum() is in an interface. It could be defined as follows:

@Override
public Class<MyEnum> getEnum() {
    return MyEnum.class;
}

But what would then then be the return type of the interface method to allow any Class object of a class that is both an enum and implements MyInterface?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

多像笑话 2024-09-14 06:23:54

您的方法由 T 参数化 - 这个想法是调用者 可以指定 T 是什么 - 而不是方法实现。

对第二个方法的调用有效,因为 T 被隐式指定(由调用者)为 MyEnum

Your method is parameterized by T - the idea is that the caller gets to specify what T is - not the method implementation.

The call to the second method works because T is implicitly specified (by the caller) to be MyEnum.

递刀给你 2024-09-14 06:23:54

我也找到了第二个问题的答案:

具有泛型类型的接口需要参数化:

public interface MyEnumReturner <T extends Enum<T> & MyInterface>
{
    public Class<T> getEnum(Class<T> t);
}

然后实现该接口的类定义要使用的类型:

public class MyClass implments MyEnumReturner<MyEnum>
{
    @Override
    public Class<MyEnum> getEnum() {
        return MyEnum.class;
    }

}

I've found the answer to my second question too:

The interface with the generic type needs to be parameterized:

public interface MyEnumReturner <T extends Enum<T> & MyInterface>
{
    public Class<T> getEnum(Class<T> t);
}

Then the class implementing the interface defines which type to use:

public class MyClass implments MyEnumReturner<MyEnum>
{
    @Override
    public Class<MyEnum> getEnum() {
        return MyEnum.class;
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文