我的理解是泛型类型是不变的,所以如果我们B作为子类型A,则List<B>与之无关List<A>.因此,铸造将无法正常工作的List<A>和List<B>.
从Effective Java Third Edition我们有这段代码:
// Generic singleton factory pattern
private static UnaryOperator<Object> IDENTIFY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identifyFunction() {
return (UnaryOperator<T>) IDENTIFY_FN; //OK But how, why?
}
public static void main(String[] args) {
String[] strings = {"a", "b", "c"};
UnaryOperator<String> sameString = identifyFunction();
for (String s : strings) {
System.out.println(sameString.apply(s));
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里很困惑.我们已经投下IDENTIFY_FN,其类型UnaryOperator<Object>,对UnaryOperator<T>,它有另一种类型的参数.
当类型擦除发生时String是Object的子类型,但据我所知, …
不幸的是,Effective Java 中没有任何文章讨论保留类型名称“var”(因为它是在 java 10 中引入的)。
有一种说法是,尽可能使用接口作为类型(条款 64:通过接口引用对象)。但是使用时var:
var list = new ArrayList<String>(); // infers ArrayList<String>
(list属于类型ArrayList<String>)
《Effective Java》指出,通过变量的实现来引用变量是一种不好的做法,因为它会使代码依赖于它。这只是我在代码中开始使用 var 时发现的一个烦恼。
使用保留类型名称“var”时是否有任何最佳实践?我什么时候应该使用它?我什么时候应该避免它?
虽然昨天工作正常。今天,我无法编译我的项目(spring-boot)。我创建了一个演示项目来模拟我当前项目中发生的相同问题。
当我尝试使用运行按钮运行项目时,它不想编译。请注意失败编译中的所有错误。此外,您可以看到所有依赖项都已导入(请参阅外部库):
我知道我可以通过mvn spring-boot:run在终端中输入来运行该应用程序。但出于某种原因,我不想那样做。
可以看到,这个demo是一个简单的spring-boot项目:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demox</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demox</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我尝试了无数的解决方案:
mvn clean->构建 …我想清除 IntelliJ 的剪贴板历史记录。我查看了文档,但找不到方法。
我想要清除剪贴板历史记录的原因是我将录制一个视频,在其中调用剪贴板历史记录,并且我不希望观看者看到剪贴板历史记录中不需要的内容。我该怎么做?
非常感谢您的帮助。
我知道类型擦除,但这对我来说没有意义。
class Base{
public <T> Collection<T> transform(Collection<T> list)
{
return new ArrayList<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Derived extends Base {
@Override // compilation error
public Collection<CharSequence> transform(Collection<CharSequence> list) {
return new HashSet<CharSequence>();
}
}
Run Code Online (Sandbox Code Playgroud)
我的IDE中生成一个错误:
“派生”中的“ transform(Collection)”与“基本”中的“ transform(Collection)”冲突;两种方法具有相同的擦除,但是都不能覆盖另一种方法
我的想法是我们可以transform在编译器没有错误的情况下进行覆盖。为什么transform在Derived中不能正确覆盖transformBase中的方法?我知道这与类型擦除有关。我不明白为什么。
我对 bash 比较陌生。
我的 mac 默认安装了 bash 3。
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
我相信我已经为 MacOSX 安装并配置了 bash 5。运行bash -version命令输出:
GNU bash, version 5.0.3(1)-release (x86_64-apple-darwin18.2.0)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Run Code Online (Sandbox Code Playgroud)
问题是我无法执行任何 Bash 5 功能,例如此代码使用 bash 4 功能无法输出预期行为:
for i …Run Code Online (Sandbox Code Playgroud) 我在互联网上找到了以下代码。
class A {
public void perform_work() {
System.out.println("A");
}
}
class B extends A {
public void perform_work() {
System.out.println("B");
}
}
class C extends B {
public void perform_work() {
((A) this).perform_work(); // Line 163
}
public static void main(String[] args) {
C c = new C();
c.perform_work();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以干净地编译,但是运行时却给我一个错误:
Exception in thread "main" java.lang.StackOverflowError
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163)
at com.hamzablm.C.perform_work(Main.java:163) …Run Code Online (Sandbox Code Playgroud) 我正在阅读Java中的equals方法,我听到人们说==测试引用相等(它们是否是同一个对象)..equals()价值平等的测试(它们在逻辑上是否"相等").
我相信这是真的,但是,如果你看一下源代码.equals(),它只是顺从了==
从Object类:
public boolean equals(Object obj) {
return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)
现在我很困惑.我看到的是我们正在测试当前对象是否具有与显式参数相同的引用.它是测试引用相等还是值相等?