Como posso ver em Java se um objeto é uma matriz sem usar reflexão? E como posso iterar por todos os itens sem usar reflexão?
Eu uso o Google GWT, portanto, não tenho permissão para usar o reflexo :(
Eu adoraria implementar os seguintes métodos sem usar refelection:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
BTW: nem quero usar JavaScript de forma que possa usá-lo em ambientes não-GWT.
java
arrays
gwt
instanceof
Edbras
fonte
fonte
obj.getClass().getComponentType()
.Você pode usar
instanceof
.JLS 15.20.2 Operador de comparação de tipo
instanceof
Isso significa que você pode fazer algo assim:
Você teria que verificar se o objeto é um
instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
, ouObject[]
, se você quiser detectar todos os tipos de matriz.Além disso, um
int[][]
é uminstanceof Object[]
, portanto, dependendo de como você deseja lidar com matrizes aninhadas, pode ficar complicado.Para o
toString
,java.util.Arrays
tem umtoString(int[])
e outras sobrecargas que você pode usar. Também temdeepToString(Object[])
para matrizes aninhadas.Vai ser muito repetitivo (mas até
java.util.Arrays
é muito repetitivo ), mas é assim em Java com arrays.Veja também
fonte
java.util.Arrays
funciona, sim. Vejo que você está lendo o código ao qual vinculei.Pode-se acessar cada elemento de uma matriz separadamente usando o seguinte código:
Observe que não é necessário saber que tipo de array subjacente é, pois isso funcionará com qualquer array.
fonte
isArray()
já estava adequadamente coberto nas respostas postadas 4 anos antes desta.Não há relacionamento de subtipagem entre matrizes de tipo primitivo ou entre uma matriz de tipo primitivo e matriz de um tipo de referência. Consulte JLS 4.10.3 .
Portanto, o seguinte está incorreto como um teste para ver se
obj
é uma matriz de qualquer tipo :Especificamente, não funciona se
obj
for uma matriz 1-D de primitivas. (Funciona para matrizes primitivas com dimensões maiores, porque todos os tipos de matrizes são subtipos deObject
. Mas é discutível neste caso.)A melhor solução (para a
isArray
parte da questão da matriz) depende do que conta como "usar reflexão".No GWT, a chamada
obj.getClass().isArray()
não conta como usar a reflexão 1 , então essa é a melhor solução.Caso contrário, a melhor maneira de descobrir se um objeto tem um tipo de array é usar uma sequência de
instanceof
expressões.Você também pode tentar mexer com o nome da classe do objeto da seguinte maneira, mas a chamada para
obj.getClass()
está beirando a reflexão.1 - Mais precisamente, o
Class.isArray
método é listado como suportado pelo GWT nesta página .fonte
Você pode criar uma classe de utilitário para verificar se a classe representa qualquer coleção , mapa ou matriz
fonte
Simplesmente
obj instanceof Object[]
(testado em JShell).fonte