天天看點

java map 多種類型嗎_是多種類型的Java清單是否可行

昨天我偶然發現了一些我無法解釋的奇怪的Java / Spring / IntelliJ行為.

這是使用jdk1.8.0_152建立的Spring Boot應用程式.

我運作這個簡單的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 {

@Query("SELECT new map(id as key, name as value) FROM TestOrganization")

List> findAllAndMapById();

}

這就是讓事情變得混亂的地方.

我編寫了一個簡單的單元測試來檢查值,但結果證明它在第二個斷言時失敗:

@Test

public void shouldGetDocumentByName() {

List values = testOrganizationRepository.findAllAndMapById()

.stream()

.flatMap( m -> m.values().stream() )

.collect( Collectors.toList() );

assertThat( values ).isNotEmpty();

assertThat( values ).allMatch( n -> n instanceof String );

}

使用IntelliJ進行調試時,它顯示如下值:

java map 多種類型嗎_是多種類型的Java清單是否可行

這怎麼可能?為什麼我能在String的List中包含Long值?

也:

values.add(1L) // fails to compile

values.get(0).getClass().name // returns java.lang.String

values.get(1).getClass().name // returns java.lang.Long