在Java中,匿名类可以声明自己的类型参数吗?

发布于 2024-10-14 03:59:55 字数 23 浏览 8 评论 0原文

匿名类可以声明自己的类型参数吗?

Can an anonymous class declare its own type parameters?

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

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

发布评论

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

评论(3

宣告ˉ结束 2024-10-21 03:59:55

你是对的,这是不可能的。由于匿名类只能使用一次,因此向其添加永远无法实际使用/继承的类型参数有何意义?您不能从定义它的代码位置以外的任何其他代码位置多次实例化匿名类,也不能对其进行子类化。

You are right, it's not possible. Since an anonymous class is meant to be used only once, what would be the point of adding type parameters to it which you can never actually use/inherit? You can't instantiate an anonymous class more than once from any other code location than the one which defines it, and you can't subclass it either.

苍暮颜 2024-10-21 03:59:55

不可以。Java 语言规范详尽地定义了类实例创建表达式的可能参数,如下所示:

类实例创建表达式
指定要实例化的类,
可能后面跟着类型参数
(如果正在实例化的类是
通用 (§8.1.2)),然后是 (a
可能为空)实际值列表
构造函数的参数。这是
也可以传递显式类型
构造函数本身的参数
(如果是泛型构造函数
(§8.8.4))。的类型参数
构造函数立即遵循
关键词新。这是一个编译时
如果有任何类型参数,则错误
用于类实例创建
表达式是通配符类型参数
(第 4.5.1 节)。类实例创建
表达式有两种形式:

  • 不合格的类实例创建
    表达式以关键字开头
    新的。不合格的类实例
    创建表达式可用于
    创建一个类的实例,
    无论该类是否是
    顶级(§7.6),成员(§8.5,§9.5),
    本地(§14.3)或匿名类
    (§15.9.5)。

  • 合格的类实例创建
    表达式以 Primary 开头。一个
    合格的类实例创建
    表达能够创造
    内部成员类的实例和
    他们的匿名子类。

因此,虽然您可以指定超类或接口或构造函数的实际类型参数,但不能定义新的类型参数。虽然我承认这在某些罕见的情况下可能很有用(因为可以从类主体中使用新的类型参数),但有一个简单的解决方法:

  • 将类实例创建表达式包装在泛型方法中(匿名类将看到封闭方法的类型参数)
  • 使用命名类

No. The Java Language Specification exhaustively defines the possible arguments to a class instance creation expression as follows:

A class instance creation expression
specifies a class to be instantiated,
possibly followed by type arguments
(if the class being instantiated is
generic (§8.1.2)), followed by (a
possibly empty) list of actual value
arguments to the constructor. It is
also possible to pass explicit type
arguments to the constructor itself
(if it is a generic constructor
(§8.8.4)). The type arguments to the
constructor immediately follow the
keyword new. It is a compile-time
error if any of the type arguments
used in a class instance creation
expression are wildcard type arguments
(§4.5.1). Class instance creation
expressions have two forms:

  • Unqualified class instance creation
    expressions begin with the keyword
    new. An unqualified class instance
    creation expression may be used to
    create an instance of a class,
    regardless of whether the class is a
    top-level (§7.6), member (§8.5, §9.5),
    local (§14.3) or anonymous class
    (§15.9.5).

  • Qualified class instance creation
    expressions begin with a Primary. A
    qualified class instance creation
    expression enables the creation of
    instances of inner member classes and
    their anonymous subclasses.

So while you can specify the actual type parameters of the super class or interface, or the constructor, you can not define new ones. While I grant that this might be useful in some rare cases (because the new type parameter could be used from the class body), there are easy workaround for that:

  • wrap the class instance creation expression in a generic method (the anonymous class will see the enclosing method's type parameter)
  • use a named class
手长情犹 2024-10-21 03:59:55

但是,有一种方法可以使用参数。

匿名类内部任何声明的方法都可以使用

  • 外部类final
  • 方法参数和final方法
  • 变量

的属性,下面的代码演示了这一点,

public class Foo
{

    private String value = "Hello ";

    public void anonymousTest(final boolean asc)
    {
        final String world = "world";

        new Comparable<String>()
        {
           @Override
           public int compareTo(String o)
           {
                System.out.println( value + world);
                int cmp = value.compareTo(o);
                return asc ?cmp :0-cmp;
            }
        }; 
    }
}

希望该示例对您有所帮助。

But, there is a way to use parameters.

Any declared method inside the anonymous class can use the

  • properties of the outer class final
  • method parameters and final method
  • variables

the following code demonstrate it

public class Foo
{

    private String value = "Hello ";

    public void anonymousTest(final boolean asc)
    {
        final String world = "world";

        new Comparable<String>()
        {
           @Override
           public int compareTo(String o)
           {
                System.out.println( value + world);
                int cmp = value.compareTo(o);
                return asc ?cmp :0-cmp;
            }
        }; 
    }
}

I hope that the example will help.

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