@oliholz que está downcasting com sobrecarga de análise adicionais
Ben Barkay
Respostas:
284
Você não pode. Uma constante numérica básica é considerada um número inteiro (ou longo, se seguido por um "L"), portanto, você deve explicitamente fazer o downcast para um byte para passá-lo como parâmetro. Tanto quanto eu sei, não há atalho.
Se você está fazendo muito desse tipo de coisa, pode definir um método auxiliar simples em byte b(int i) { return (byte) i; }algum lugar e importá-lo estaticamente. Então você pode escrever f (b (10)).
usar o seguinte
125
Você tem que lançar, eu tenho medo:
f((byte)0);
Acredito que realizará a conversão apropriada no momento da compilação, em vez do tempo de execução , portanto não causará penalidades de desempenho. É apenas inconveniente :(
+1 para conversão em tempo de compilação. É senso comum se vocês entenderem compiladores e tiverem fé em designers de linguagem (o que deveríamos), mas, caso contrário, não serão tão óbvios.
Philip Guin
31
Você pode usar um literal de byte em Java ... mais ou menos.
Estes não são literais de bytes. Eles são literais de vários outros tipos (int, principalmente) que estão sendo implicitamente convertidos em um byte. por exemplo, 1é um literal int, mas double d = 1;compila perfeitamente.
smehmood
Se você já está usando truques. Tenha uma importação estática de byte b(int i){}, então b(1), pelo menos e mais complicado que f=1.
Elazar Leibovich
1
@smehmood, mas desde que a conversão é feita pelo pré-compilador / compilador (antes mesmo de o programa começar a ser executado) e não pelo tempo de execução, é literal, não é?
Pacerier 8/09/14
2
@ Pacerier É um literal. Não é um "byte literal". É um int. O compilador o trata como um literal int (como deveria) e faz um downcast implícito na atribuição (como também deveria). Em nenhum momento ele é analisado como um "byte literal" (que não existe). Veja a Seção 5.2 do JLS, em particular a segunda metade, referente à restrição de conversões. As únicas coisas envolvidas são uma constante inteira e a aplicação de uma regra de conversão de atribuição apropriada a uma variável de bytes.
Jason C
Eu dei essa resposta +1 porque a técnica é nova, mas, de fato, não há "literais de bytes" em Java.
12
Se você está passando literais no código, o que impede você de simplesmente declará-lo com antecedência?
-1 Isso é muito ruim para a legibilidade do código. E pode causar problemas quando as pessoas realmente tentam transmitir um valor maior do que o byte pode conter. Eu desencorajo as pessoas a usar esse método!
Rolfツ
3
Além disso, esse elenco acontecerá em tempo de execução. Muito mal.
precisa saber é o seguinte
Concordando completamente com Rolf (Tsu), talvez valha a pena acrescentar que, tecnicamente, está sobrecarregando, não substituindo.
Cromax
-2
Com o Java 7 e a versão posterior, você pode especificar um literal de byte desta maneira:
byte aByte = (byte)0b00100001;
Respostas:
Você não pode. Uma constante numérica básica é considerada um número inteiro (ou longo, se seguido por um "L"), portanto, você deve explicitamente fazer o downcast para um byte para passá-lo como parâmetro. Tanto quanto eu sei, não há atalho.
fonte
byte b(int i) { return (byte) i; }
algum lugar e importá-lo estaticamente. Então você pode escrever f (b (10)).Você tem que lançar, eu tenho medo:
Acredito que realizará a conversão apropriada no momento da compilação, em vez do tempo de execução , portanto não causará penalidades de desempenho. É apenas inconveniente :(
fonte
Você pode usar um literal de byte em Java ... mais ou menos.
0xa
(int literal) é convertido automaticamente em byte. Não é um literal de byte real (consulte JLS e comentários abaixo), mas se ele parecer um pato, eu o chamo de pato.O que você não pode fazer é o seguinte:
Você deve transmitir da seguinte maneira:
Mas lembre-se de que tudo isso será compilado e eles estão usando "literais de bytes":
Claro que isso compila também
fonte
1
é um literal int, masdouble d = 1;
compila perfeitamente.byte b(int i){}
, entãob(1)
, pelo menos e mais complicado quef=1
.Se você está passando literais no código, o que impede você de simplesmente declará-lo com antecedência?
fonte
public static final byte BYTE_MASK = ( byte )0xff;
byte BYTE_MASK = 0x000000ff;
para que eu não tivesse alguns erros de extensão de sinal desagradáveis.Que tal substituir o método por
isso permitirá
f(0)
fonte
Com o Java 7 e a versão posterior, você pode especificar um literal de byte desta maneira:
byte aByte = (byte)0b00100001;
Referência: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html
fonte