static <T> void f1(Base arg1, T arg2) {
T loc = (T) arg1; // why Derived is "kind of cast" to String?
System.out.println(loc.getClass().getName()); // would print: Derived
}
f1(new Derived(), "sdf"); // T is String - inferred from arg2
class Base { }
class Derived extends Base { }
Run Code Online (Sandbox Code Playgroud)
我的想法是正确的:写作演员(T)意味着"编译器不能也不会检查这个演员".在编译时编译器不知道arg2会是什么(并且它可能是任何东西),因此编译器不能排除强制转换可以工作并且必须信任程序员.因此,在编译时永远不会检查此强制转换.在运行时,局部var声明看起来像Object loc = arg1;(在类型擦除之后).所以一切正常,因为编译器从不关心这个(T)演员?
PS:我的研究:这个,这个.这也很有意思("将原语转换为通用":( T)true)我的问题更明确地指出问题,问题还在于编译器是否检查了演员(T)并且没有分心有问题的代码示例.
https://mvnrepository.com/repos/central和 http://central.maven.org/maven2/是同一个 maven 存储库(称为Maven Central )吗?
还有https://repo.maven.apache.org/maven2/,它也称自己为中央存储库。
我使用mvnrepository.com它是因为我发现它更方便,但是互联网上许多对 Maven Central 的引用都指向http://central.maven.org
另外上面两个网站都是针对 Maven2 的,对吗?
Maven3 的类似物是什么?
另外Maven3应用广泛吗?
我认为任何算术表达式的结果至少是一个int.7/3是一个表达式 - 它有一个运算符(除法).
但为什么编译好呢?
byte b1 = 7 / 3; // 7/3 is not a literal?
short b2 = 7 / 3; // 7/3 is not a literal?
char b3 = 7 / 3; // 7/3 is not a literal?
Run Code Online (Sandbox Code Playgroud)
和f1()编译好吗?
byte f1() {
return 7 / 3; // Why is it allowed? Why isn't 7 / 3 an int ?
}
byte f2(int x) {
return x / 3; // c.ERR - type mismatch
}
byte f3(byte x) { …Run Code Online (Sandbox Code Playgroud) 制作一个不可变对象是个坏主意Cloneable.这就是为什么 String不能克隆.不可变BigInteger并且BigDecimal也没有 Cloneable.
但是无法克隆可变的StringBuilder和StringBuffer!
这种决定背后的原因是什么?
是的,我可以使用"复制构造函数",new StringBuilder(CharSequence seq)但提供复制构造函数和禁止克隆的设计原则/推理是什么?
虽然switch(null)是一个编译错误,但是switch(str)很好(str被static final String str = null;)。
难道不是static final String str = null; 在编译时就将其替换为switch(str)的编译时常量switch(null)吗?
switch (null) { // compile Error immediately!
}
Run Code Online (Sandbox Code Playgroud)
但:
public class Test {
// compile-time constant?
static final String s4 = null;
public static void main(String[] args) {
switch (s4) { // compiles fine! NPE at runtime
}
}
}
Run Code Online (Sandbox Code Playgroud)
PS我想这static final String str = null; 不是一个编译时常量,因为只有static final String str = 'string …
为什么YearMonth类不是时间性的(接口)而MonthDay不是时间性的?
这似乎很奇怪,因为这两个类的含义几乎相同。
我可能建议不要在使用Temporal接口的任何地方使用MonthDay,但是也许有更好的理由。
我正在使用 Eclipse(这可能无关紧要)并且我想从提交中排除 Maven 目标文件夹。
有很多记号
/target/***/target/*/target/**target//target/有什么不同?
它们每个的确切含义是什么?
我很困惑,为什么x++;不允许在实例初始值设定项内增加尚未声明的字段(),但是如果包装到匿名类中,则允许在实例初始值设定项内进行递增(是的,匿名类可以访问类字段,但未初始化该字段! )。
class Test {
{ x++; } // ERR: Cannot reference a field before it is defined
Object anonFld = new Object() {
{ x++; } // fine! Sets x field below to 1 !
void f() {
x++; // fine!
}
};
int x;
// now x = 1 // anon constructor has set it!
}
Run Code Online (Sandbox Code Playgroud) 仅在超类/抽象类中声明 slf4j 记录器使子类的内容更清晰(没有像private static final Logger logger = LoggerFactory.getLogger(Tuple5x36.class);混乱一样的混乱)。
这种做法是推荐的,还是存在重大缺陷?
这行代码
Class<String> cls = (Class<String>) Class.forName("java.lang.String");
Run Code Online (Sandbox Code Playgroud)
提供编译器警告 Type safety: Unchecked cast from Class<capture#1-of ?> to Class<String>
此外,根据API定义,它返回返回Class<?>:
Class<?> Class.forName(String arg)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么转换为Class<?>to Class<String>被视为未选中(即编译器无法检查编译时是否可以进行转换).
如果它是
Class<String> cls = (Class<String>) Class.forName("some_str_var");
Run Code Online (Sandbox Code Playgroud)
我可以理解编译器在编译时不能知道Class.forName()的返回类型(因为参数是一个变量,而不是文字),并且在运行时类型信息被删除.
但是在编译期间Class.forName("java.lang.String")是显而易见的Class<?>(并且clsLHS中的变量仍然是Class<String>),没有类型信息被删除(编译器看到源代码,而不是带有擦除类型信息的字节代码),编译器可以检查所有内容.
作为开发人员,我希望从Oracle(Oracle JDK)安装JDK11二进制分发版,并从Oracle获得7年(LTS)的免费更新。这可以免费吗?
我认为这是不可能的,因为从JDK11出现在Oracle网站上开始的6个月后,我将无法从Oracle网站下载它(具有任何最新更新的Oracle JDK 11版本,如11.0.2),并且我将无法下载无需Oracle付费订阅就可以找到(在Oracle网站上)此类更新的下载位置(对于OracleJDK)。我想我可以搜索OpenJDK 11付费的替代品,以获得超过6个月的更新(例如Red Hat),但是我不知道有任何免费替代品-请告知!
我知道以下内容(如果我输入错了,请纠正我):
有一个带有OpenJDK 更新的奇怪站点(Mercurial回购?),但是我似乎没有任何实用的方法来使用该站点。
我认为社区中存在一些讨论,现在该如何处理OpenJDK版本的更新-谁以及如何做。但是今天没有人这样做。
另外,RedHat 似乎为OpenJDK提供了一些更新,但是我不了解整个情况。我猜想,如果我为RHEL付费,那么他们会更新我的JDK作为RHEL的一部分(这就像购买Oracle JDK,但可能更便宜,我不知道。此外,RHEL似乎使用OpenJDK,而不是OracleJDK。确保OpenJDK和OracleJDK现在完全相同,正如Oracle声称的那样)。
关于OpenJDK的更新(不存在这样的更新?!),我不明白这一点-如果甲骨文声称,它是Oracle在谁的网站jdk.java.net OpenJDK的提供释放(参见(!)(!)prooflink),为什么甲骨文在至少6个月内还没有为这些OpenJDK提供更新(dk.java.net站点上没有此类更新)?OracleJDK和OpenJDK现在“完全相同”,Oracle仍将OracleJDK更新为6个月-为什么不同时将OpenJDK也更新为6个月?

PS 看起来像甲骨文承诺将有助于安全更新的OpenJDK 季度(而不是任何其他更新:性能更新,稳定性更新,如Oraccle JDK,如果我付的“Java SE认购”,其中包括更新和在线/电话支持24/7在服务器或云中每个处理器每月25美元):

同样有趣的是,Mark Rotteveel(请参见注释)写道,JDK源代码只有一个地方:(可能是http://hg.openjdk.java.net/ 我不知道与http:/的区别/openjdk.java.net/),甚至Oracle(及其他)也从那里获取代码: …