2010-05-10 16 views
21

क्या क्लास ऑब्जेक्ट जावा जेनेरिक क्लास में टाइप वैरिएबल से प्राप्त करने का कोई तरीका है? ऐसा ही कुछ:जावा क्लास ऑब्जेक्ट टाइप वेरिएबल

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

इस प्रकार की जानकारी संकलन समय पर उपलब्ध है और इसलिए प्रकार विलोपन द्वारा प्रभावित नहीं किया जाना चाहिए, इसलिए, सैद्धांतिक रूप से, वहाँ यह पूरा करने के लिए एक तरह से किया जाना चाहिए। क्या यह अस्तित्व में है?

+2

अपने घोषणा वास्तव में होना चाहिए सार्वजनिक वर्ग बार फू {... फैली ?? – Kilokahn

उत्तर

25

यह काम करता है:

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

-1। यह बस नहीं कर सकता है। http://java.sun.com/docs/books/tutorial/java/generics/erasure.html – Roman

+4

@Roman यह नहीं कर सकता है? बस कोशिश करो। वास्तव में ऐसा करने के बिना डाउनवॉटिंग आपके गलत जवाब पर जोर देते हुए हास्यास्पद है। – sfussenegger

+0

@Roman: यह बस कर सकते हैं। आप अपने लिए क्यों कोशिश नहीं करते? –

6

कोड स्निपेट थोड़ा भ्रामक है। क्या टी टाइप पैरामीटर या क्लास है?

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()); 
} 

असल में दूसरा println अपवाद का कारण बन जाएगा।

+0

क्या दूसरा को ठीक करने का कोई तरीका है? – Freewind

+2

यह एक प्रकार का उपयोग करने योग्य है (इस प्रकार कक्षा में जाति योग्य नहीं है) और इसमें टी (स्ट्रिंग श्रेणी में नहीं) है जो वास्तव में कुछ भी उपयोगी नहीं कहता है। – durilka

+1

ओरिगनल पोस्ट में उदाहरण टी को पैरामीटर के रूप में घोषित नहीं करता है। इस टी की तरह लिखित एक वर्ग होना चाहिए ... – tkr

3

इस कोड को व्युत्पन्न वर्ग के लिए काम करता है और साथ ही:

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]; 
    } 
} 

यहां से snagged: https://stackoverflow.com/a/4699117/26510

संबंधित मुद्दे