我知道并非所有WTF都是平等的,但为什么这甚至是有效的。它确实编译并且只在你运行时抱怨,因为它没有static void main
方法,但除此之外,它在语法上是正确的。
我试着给它main
方法,把它放在一个名为_.java
的文件中,它确实运行了。
class _<_>
{
<_> _ _(_ _){ return (_)_; }
}
显然,class
中的“事物”是一个方法,它接受一个名称与其类型相同的参数,并返回它作为参数获得的任何内容。 (_)_
显然是一些投射。
但我没有在(_ _)
之前得到这个部分。
我猜方法的名称是_
,但是什么是<_> _
?如果是泛型,那么它不应该是_<_>
吗?
答案 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采取的方法是正确的,但结果不正确。
<T>
(<_>
)的声明 shadows 类类型Node
的声明({{ 1}});所以参数的类型为_
,而不是类型T
Node
。结果:
X
阴影规则在JLS section 6.4.1中说明。适用于这种情况的具体问题是:
名为
class Node<X> { <T> T foo(T t) { return (T) t; } }
的类型的声明d
会影响任何声明 名为n
的其他类型,它们位于n
出现的范围内 在d
的整个范围内。