为什么这样甚至会被允许?

时间:2015-03-28 05:09:54

标签: java syntax

我知道并非所有WTF都是平等的,但为什么这甚至是有效的。它确实编译并且只在你运行时抱怨,因为它没有static void main方法,但除此之外,它在语法上是正确的。 我试着给它main方法,把它放在一个名为_.java的文件中,它确实运行了。

class _<_>
{
    <_> _ _(_ _){ return (_)_; }
}

显然,class中的“事物”是一个方法,它接受一个名称与其类型相同的参数,并返回它作为参数获得的任何内容。 (_)_显然是一些投射。 但我没有在(_ _)之前得到这个部分。 我猜方法的名称是_,但是什么是<_> _?如果是泛型,那么它不应该是_<_>吗?

2 个答案:

答案 0 :(得分:2)

将_替换为使用完全建议的内容。然后,您可能会发现<_> _ _(_ _)部分是<T> Node foo(Node node)。所以它确实是方法名称和返回类型。

class Node<T> {

    <T> Node foo(Node node) {
        return (Node) node;
    }

    public static void main(String[] args) {
        Node<String> a = new Node();
        Node<String> b = new Node();
        a.foo(b);
    }
}

答案 1 :(得分:1)

@ravindrab采取的方法是正确的,但结果不正确。

  1. 原始源代码中方法类型参数<T><_>)的声明 shadows 类类型Node的声明({{ 1}});所以参数的类型为_,而不是类型T
  2. 方法类型参数也会影响类的类型参数,因此为了避免混淆,最好给它一个不同的名称,例如Node
  3. 结果:

    X

    阴影规则在JLS section 6.4.1中说明。适用于这种情况的具体问题是:

      

    名为class Node<X> { <T> T foo(T t) { return (T) t; } } 的类型的声明d会影响任何声明   名为n的其他类型,它们位于n出现的范围内   在d的整个范围内。