Java是否可以列出多种类型

Java是否可以列出多种类型,java,spring,spring-boot,jpa,java-8,Java,Spring,Spring Boot,Jpa,Java 8,昨天我偶然发现了一些奇怪的Java/Spring/IntelliJ行为,我无法解释 这是一个用jdk1.8.0_152制作的Spring引导应用程序 我运行这个简单的SQL来填充我的数据库: CREATE TABLE TEST_ORGANIZATION ( ID NUMBER(19) NOT NULL, NAME VARCHAR(255) NOT NULL ); INSERT INTO TEST_ORGANIZATION (ID, NAME) VALUES ('1', 'tes

昨天我偶然发现了一些奇怪的Java/Spring/IntelliJ行为,我无法解释

这是一个用jdk1.8.0_152制作的Spring引导应用程序

我运行这个简单的SQL来填充我的数据库:

CREATE TABLE TEST_ORGANIZATION
(
    ID NUMBER(19) NOT NULL,
    NAME VARCHAR(255) NOT NULL
);

INSERT INTO TEST_ORGANIZATION (ID, NAME) VALUES ('1', 'test1');
INSERT INTO TEST_ORGANIZATION (ID, NAME) VALUES ('2', 'test2');
这是我的实体类:

@Data
@NoArgsConstructor
@Entity
public class TestOrganization {

    @Id
    private Long id;

    @NotNull
    private String name;
}
和我的JPA存储库:

public interface TestOrganizationRepository extends JpaRepository<TestOrganization, Long> {

    @Query("SELECT new map(id as key, name as value) FROM TestOrganization")
    List<Map<String, String>> findAllAndMapById();
}

是的,你可以,这里有一个小例子

public static void main(String args) {
        List objects = new ArrayList();
        objects.add("string");
        objects.add(1L);

        List<String> onlyStrings = objects;

    }
publicstaticvoidmain(字符串参数){
列表对象=新的ArrayList();
对象。添加(“字符串”);
对象。添加(1L);
仅列出字符串=对象;
}

如果愿意,您可以将非泛型列表转换为列表(您会收到大量编译器警告)

这是可能的,因为Java中的类型擦除。简而言之,这意味着在运行时Java不知道您的泛型类型,因此任何
List
对象都使用
object
类型操作。泛型具有编译类型安全性。 例如,您可以阅读更多关于类型擦除的详细信息

您可以自己模仿的相同行为:

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    addToList(list);
    System.out.println(list);
}

private static void addToList(List list) {
    list.add(1L);
    list.add(42);
    list.add("String");
    list.add(new Runnable() {
        @Override
        public void run() {}
    });
}
您将获得
java.lang.ClassCastException


因此,在编译时,您使用
List
,但在运行时,Java只知道
List

,请考虑以下示例:

public static void main(String[] args) {
    List a = new ArrayList();
    a.add("a");
    a.add(1L);

    List<String> b = new ArrayList(a);

    System.out.println(b);
}
以上是合法的,因为java执行类型擦除,从而在运行时丢弃元素类型信息。这意味着每个列表本质上是一个列表,可以包含多个类实例

public interface List<E> extends Collection<E>
在编译时

如果E是绑定的,即E扩展MyClass,它将转换为MyClass


在您的例子中,您正在为每一行实例化一个映射,没有类型边界,您正在将其平面映射,然后将其收集到一个列表,这实际上与我的示例相同,因此是合法的

谢谢!不知怎的,我忘了打字擦除。希望我最终能够打破Java:D@PatrykKrawczyk没问题!总是乐于助人!:)
for (String s : list) {
    System.out.println(s);
}
public static void main(String[] args) {
    List a = new ArrayList();
    a.add("a");
    a.add(1L);

    List<String> b = new ArrayList(a);

    System.out.println(b);
}
[a, 1]
public interface List<E> extends Collection<E>
public interface List extends Collection