Chuyển đổi Số nguyên thành Dài


108

Tôi cần lấy giá trị của một trường bằng cách sử dụng phản xạ. Điều đó xảy ra là tôi không phải lúc nào cũng chắc chắn kiểu dữ liệu của trường là gì. Vì vậy, và để tránh một số mã trùng lặp, tôi đã tạo phương pháp sau:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

Và sử dụng phương pháp này như:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

hoặc là

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

Vấn đề là tôi dường như không thể truyền Integerđến Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

Có cách nào tốt hơn để đạt được điều này không?

Tôi đang sử dụng Java 1.6.

Câu trả lời:


91

Không, bạn không thể truyền Integersang Long, mặc dù bạn có thể chuyển đổi từ intsang long. Đối với một giá trị riêng lẻ được biết là một số và bạn muốn nhận giá trị dài, bạn có thể sử dụng:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

Đối với mảng, nó sẽ phức tạp hơn ...


Đối với mảng, tôi có thể sử dụng một Number[]và một vòng lặp trên nó để tạo một mảng được định kiểu thích hợp, phải không?
Tiago Veloso,

@Tiago: Nó phụ thuộc vào những gì phương thức thực sự trả về. double[]Ví dụ như điều đó sẽ không hiệu quả , nhưng sẽ hiệu quả với một Double[].
Jon Skeet

7
Tại sao bạn không thể truyền từ Số nguyên sang Dài?
MrMas

@MrMas: Bởi vì chúng là các kiểu tham chiếu riêng biệt, cả hai đều là lớp con trực tiếp của Number. Hay nói một cách khác: bạn tin rằng quy tắc chuyển đổi nào cho phép bạn chuyển đổi từ quy tắc này sang quy tắc chuyển đổi khác?
Jon Skeet

6
Đồng ý. Vấn đề là tính kế thừa. Tôi đang nghĩ về độ chính xác. Một số nguyên có thể được chuyển đổi thành một số nguyên dài mà không làm mất thông tin. Nhưng cấu trúc kế thừa không có bất kỳ thông tin nào cho trình biên dịch biết điều đó.
MrMas


53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

Điều này tránh ảnh hưởng hiệu suất khi chuyển đổi thành Chuỗi. Các longValue()phương pháp trong Integer chỉ là một diễn viên của các giá trị int. Các Long.valueOf()phương pháp cung cấp cho các vm một cơ hội để sử dụng một giá trị được lưu trữ.


2
Để được lưu bằng null: Long l = i == null? null: i.longValue ()
Adrodoc55

19

Thật kỳ lạ, tôi thấy rằng nếu bạn phân tích cú pháp từ một chuỗi thì nó hoạt động.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

Thắng lợi.


1
Nó hoàn toàn không có ý nghĩa đối với tôi, nhưng nó hoạt động như một sự quyến rũ. Cảm ơn rất nhiều!
Bouncner

33
Giới thiệu một chuyển đổi chuỗi mà không có lý do là một ý tưởng thực sự tồi ... đơn giản là không có lợi ích gì khi làm điều này.
Jon Skeet

6
Đồng ý với @JonSkeet, tốt hơn hết với điều này: Đối tượng i = 10; Dài l = ((Số) i) .longValue ();
depsypher

1
Phương pháp này hoạt động tốt nhưng là tương đối chậm và bộ nhớ sử dụng hơn so với các phương pháp khác để làm điều này ...
Krispy

1
sẽ rất tốt từ góc độ phát triển kết thúc trước
Ezeewei

8

Chuyển đổi Số nguyên thành Dài Rất đơn giản và nhiều cách để chuyển đổi
Ví dụ 1

 new Long(your_integer);

Ví dụ 2

Long.valueOf(your_integer); 

Ví dụ 3

Long a = 12345L;

Ví dụ 4
Nếu bạn đã nhập int dưới dạng Số nguyên, bạn có thể thực hiện việc này:

Integer y = 12;
long x = y.longValue();

7

Chuyển đổi một số nguyên trực tiếp thành long bằng cách thêm 'L' vào cuối Số nguyên.

Long i = 1234L;

5
Tôi chắc chắn rằng bạn đã trả lời mà không cần đọc toàn bộ câu hỏi!
Diablo

3
@Diablo câu hỏi này là kết quả đầu tiên khi tìm kiếm "int to long" trên Google, câu trả lời này có thể hữu ích cho những người khác
Dimitri W

1
@DimitriW Tôi không nói câu trả lời này sai, Nhưng tôi nói câu trả lời cho câu hỏi này là sai. Bạn nói đúng, Điều này rất hữu ích cho những người không đọc câu hỏi và chỉ xem câu trả lời.
Diablo

7

Nếu Số nguyên không rỗng

Integer i;
Long long = Long.valueOf(i);

isẽ được tự động đánh máy thành a long.

Việc sử dụng valueOfthay vì newcho phép lưu giá trị này vào bộ nhớ đệm (nếu nó nhỏ) bởi trình biên dịch hoặc JVM, dẫn đến mã nhanh hơn.


Tôi không thể tìm thấy phương thức Long.valueOf (Integer i), những phương thức duy nhất tôi tìm thấy là valueOf (long l), valueOf (String s) và valueOf (String s, int radix). Đã kiểm tra tài liệu Java8 và Java9.
Andy

1
Số nguyên được chuyển đổi ngầm thành kiểu dài nguyên thủy.
lostintranslation,


2

Nếu bạn biết rằng Integer không phải là NULL, bạn chỉ cần thực hiện điều này:

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

Một trình phân tích cú pháp từ intcác biến thành longkiểu được bao gồm trong Integerlớp. Đây là một ví dụ:

int n=10;
long n_long=Integer.toUnsignedLong(n);

Bạn có thể dễ dàng sử dụng chức năng trong xây dựng này để tạo ra một phương pháp mà phân tích từ intđể long:

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}

0

Điều này không an toàn

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();

0

Nếu bạn không biết chính xác loại số của mình ( Số nguyên , Dài , Đôi , bất kỳ), bạn có thể chuyển thành Số và nhận giá trị dài của bạn từ nó:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

Trong trường hợp Danh sách loại Dài, Thêm L vào cuối mỗi giá trị Số nguyên

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

Cố gắng chuyển đổiValue của Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

Bị phản đối vì đây chắc chắn không phải là câu trả lời tốt nhất: giải pháp này thêm phức tạp không cần thiết, chi phí hiệu suất và yêu cầu thêm một thư viện (Jackson)
NickGreen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.