小编Cod*_*ete的帖子

编译器从不检查转换为泛型类型(T)?

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)并且没有分心有问题的代码示例.

java generics casting

5
推荐指数
1
解决办法
304
查看次数

Maven Central 到底是哪个存储库?

https://mvnrepository.com/repos/centralhttp://central.maven.org/maven2/是同一个 maven 存储库(称为Maven Central )吗?

还有https://repo.maven.apache.org/maven2/,它也称自己为中央存储库。

我使用mvnrepository.com它是因为我发现它更方便,但是互联网上许多对 Maven Central 的引用都指向http://central.maven.org

另外上面两个网站都是针对 Maven2 的,对吗?

Maven3 的类似物是什么?

另外Maven3应用广泛吗?

maven-2 maven-3 maven

5
推荐指数
1
解决办法
2940
查看次数

为什么7/3不总是int?为什么它可以分配到字节或短,而x/3不能?

我认为任何算术表达式的结果至少是一个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)

java

4
推荐指数
1
解决办法
177
查看次数

是什么阻止Cloneable成为像StringBuilder这样的可变对象?

制作一个不可变对象是个坏主意Cloneable.这就是为什么 String不能克隆.不可变BigInteger并且BigDecimal没有 Cloneable.

但是无法克隆可变的StringBuilder和StringBuffer!

这种决定背后的原因是什么?

是的,我可以使用"复制构造函数",new StringBuilder(CharSequence seq)提供复制构造函数和禁止克隆的设计原则/推理是什么?

java stringbuilder clone stringbuffer cloneable

3
推荐指数
1
解决办法
59
查看次数

为什么`switch(null)`是编译错误,但是`switch(str)`可以,因为str是`static final String str = null;`?

虽然switch(null)是一个编译错误,但是switch(str)很好(strstatic 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 …

java null constants compile-time-constant switch-statement

3
推荐指数
1
解决办法
62
查看次数

为什么YearMonth是Temporal而MonthDay不是Temporal?

为什么YearMonth类不是时间性的(接口)而MonthDay不是时间性的?

这似乎很奇怪,因为这两个类的含义几乎相同。

我可能建议不要在使用Temporal接口的任何地方使用MonthDay,但是也许有更好的理由。

java java.time

3
推荐指数
1
解决办法
56
查看次数

.gitignore 中的目标/ vs /目标/

我正在使用 Eclipse(这可能无关紧要)并且我想从提交中排除 Maven 目标文件夹。

很多记号

  1. /target/**
  2. */target/*
  3. /target/**
  4. target/
  5. /target/

有什么不同?

它们每个的确切含义是什么?

eclipse git egit

2
推荐指数
1
解决办法
1907
查看次数

为什么在实例初始值设定项内不允许递增(`x ++;`)尚未声明的字段,但是如果将其包装到匿名类中就可以了吗?

我很困惑,为什么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)

java constructor field initializer anonymous-class

2
推荐指数
1
解决办法
71
查看次数

仅在超类/抽象类中声明 slf4j 记录器并在所有子类中使用它是一种好习惯吗?

仅在超类/抽象类中声明 slf4j 记录器使子类的内容更清晰(没有像private static final Logger logger = LoggerFactory.getLogger(Tuple5x36.class);混乱一样的混乱)。

这种做法是推荐的,还是存在重大缺陷?

java logging slf4j

1
推荐指数
2
解决办法
2518
查看次数

将Class.forName("java.lang.String")/'Class.forName("some_str_var")'转换为Class <String>:为什么前者生成未经检查的编译器警告?

这行代码

 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>),没有类型信息被删除(编译器看到源代码,而不是带有擦除类型信息的字节代码),编译器可以检查所有内容.

java generics reflection

1
推荐指数
1
解决办法
44
查看次数

Oracle JDK11(LTS)-作为开发人员/测试人员,我可以从Oracle免费获得LTS更新吗?

作为开发人员,我希望从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),但是我不知道有任何免费替代品-请告知!

我知道以下内容(如果我输入错了,请纠正我):

  1. 从Oracle JDK9开始,这种JDK在生产中的任何使用(即使只是使用,而不仅仅是获得更新-因此也要支付使用而无需更新)。但是在开发,测试,原型制作和演示中的任何使用仍然是免费的!
  2. 看来,对于OracleJDK使用也是免费的,如果我使用任何Oracle云服务或Oracle SQL Developer中IDE(见的“许可权利和限制”部分的许可证和“甲骨文认可的产品使用” 的定义
  3. 我可以在生产中免费使用OpenJDK(JDK9,JDK10等),这些JDK与Oracle JDK完全相同,唯一的区别是早期的OpenJDK没有二进制文件(在jdk.java.net中,它们只有源文件)作为zip)(但是二进制文件现在可以在https://jdk.java.net/archive/http://jdk.java.net/12/上找到),除了acceptopenjdk.net还 提供由OpenJDK制成的二进制文件(src取自openjdk.java.net网站)。
  4. 在JDK8之前,OracleJDK和OpenJDK之间存在显着差异(性能,稳定性等),但是从JDK9开始,这些差异将消失(Oracle声称是这样,我不知道现实)。
  5. 仅为OracleJDK(针对LTS版本JDK8,JDK11,预期的JDK17)提供LTS更新。LTS版本每3年发布一次,每个版本至少要支持7年。
  6. 因此,如果我使用OpenJDK JDK11,我将绝对不会得到任何更新(既不是6个月,也不是1年,也不是7年)。
  7. 如果我有一个来自Oracle的非LTS(例如JDK12)(仅在生产中才付费),我将仅获得大约6个月的更新-直到JDK13发布为止,而且不再(甚至是花钱)。
  8. 如果我有来自OpenJDK的非LTS(例如JDK12),我也将绝对没有更新 -我可以在jdk.java.net上以源代码(zip)的形式下载第一个JDK12,也可以作为二进制发行版(用于Windows的exe安装程序)下载),在acceptopenjdk.net

有一个带有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(及其他)也从那里获取代码: …

java java-11

1
推荐指数
1
解决办法
146
查看次数