2010-05-10 47 views
21

Có cách nào để lấy đối tượng Lớp từ biến kiểu trong lớp chung Java không? Một cái gì đó như thế:Đối tượng lớp Java từ biến kiểu

public class Bar extends Foo<T> { 
    public Class getParameterClass() { 
     return T.class; // doesn't compile 
    } 
} 

Đây là loại thông tin có sẵn tại thời gian biên dịch và do đó không nên bị ảnh hưởng bởi loại tẩy xoá, vì vậy, về mặt lý thuyết, cần có một cách để thực hiện điều này. Nó tồn tại?

+2

nên tuyên bố của bạn thực sự được public class Bar kéo dài Foo {... ?? – Kilokahn

Trả lời

25

này hoạt động:

public static class Bar extends Foo<String> { 
    public Class<?> getParameterClass() { 
    return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 
+0

-1. Nó đơn giản là không thể. http://java.sun.com/docs/books/tutorial/java/generics/erasure.html – Roman

+4

@Roman Nó không thể? Chỉ cần thử nó. Downvoting mà không thực sự làm như vậy trong khi nhấn mạnh vào câu trả lời sai của bạn là vô lý anyway. – sfussenegger

+0

@Roman: Nó chỉ đơn giản là có thể. Tại sao bạn không thử nó cho chính mình? –

6

Đoạn mã là một chút bối rối. Là một tham số kiểu hoặc một lớp?

public static class Bar extends Foo<String> { 
    public Class<?> getParameterClass() { 
     return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 

public static class Bar2<T> extends Foo<T> { 
    public Class<?> getParameterClass() { 
     return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 


public static void main(String[] args) { 
    System.out.println(new Bar().getParameterClass()); 
    System.out.println(new Bar2<Object>().getParameterClass()); 
} 

Thực tế, bản in thứ hai sẽ gây ra ngoại lệ.

+0

Có cách nào để sửa lỗi thứ hai không? – Freewind

+2

đó là một TypeVariable (do đó không castable Class) và chứa T (như trong chuỗi không lớp) mà nói chính xác không có gì hữu ích. – durilka

+1

Ví dụ trong bài orignal không khai báo T là tham số. Được viết như thế này T phải là một lớp ... – tkr

3

Mã này làm việc cho các lớp thừa kế cũng như:

import java.lang.reflect.ParameterizedType; 

public abstract class A<B> 
{ 
    public Class<B> getClassOfB() throws Exception 
    { 
     ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass(); 

     return (Class<B>) superclass.getActualTypeArguments()[0]; 
    } 
} 

vướng từ đây: https://stackoverflow.com/a/4699117/26510

Các vấn đề liên quan