gpt4 book ai didi

java - java 是否应该允许将类名定义为与泛型类型参数相同?

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:00 25 4
gpt4 key购买 nike

我在同一个包 test 中创建了如下类。只是为了测试java是否真的允许它。确实如此,但随后会出现问题。

package test;

public class E {
}


package test;

public class T {
}


package test;

import test.E;
import test.T;

public class K<E, T> {

E e;
T t;

public K(E e, T t) {
this.e = e;
this.t = t;
}

public static void main(String[] args) {
K k = new K<E, T>(new E(), new T());
}
}

以上代码给出多个编译问题

Multiple markers at this line
- Cannot make a static reference to the non-static type E
- Cannot make a static reference to the non-static type T
- Cannot make a static reference to the non-static type T
- Cannot make a static reference to the non-static type E
- K is a raw type. References to generic type K<E,T> should be
parameterized

它清楚地表明编译器混淆了 E 和类 E,对于 T 也是如此。

因此解决方法是使用包定义它的真实类型。

 K k = new K<test.E, test.T>(new test.E(), new test.T());

现在,如果所有这些类都在默认包 中,则无法解决此编译问题。所以问题是 java 是否应该允许在 default package 中声明此类?

最佳答案

It clearly shows compiler is confused between E and class E same for T.

我想你搞错了。我认为如果你仔细阅读 JLS 的相关部分(我稍后会查找它们)你会发现它们清楚地说明了 ET 应该解决什么在各种情况下。如果编译器得到错误的分辨率,我会感到非常惊讶;即不实现 JLS。

实际上,混淆是在编写代码的人的头脑中......

这里的问题是关于什么优先于什么的规则可能不是您(和典型的程序员)所期望的。但他们似乎是有充分理由的。

通常这无关紧要,但如果您忽略常规的 Java 命名约定并为类使用单字母名称,那么您可能会被烧毁。

So Question is should java allow declaration of such classes in default package?

或者,“您”应该忽略 Java 类命名约定吗?

坦率地说,如果程序员忽视风格指南/建议,他们可能会在很多方面伤害自己。但是,如果您试图过分保护程序员,您实际上会伤害他/她,因为您无法实现您需要挑战极限的东西。最好的政策是(IMO)不要将程序员视为 child 。如果他们真的想用锋利的刀玩杂耍……随他们去吧。

关于java - java 是否应该允许将类名定义为与泛型类型参数相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12312805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com