<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Olaf&#039;s blog &#187; generics</title>
	<atom:link href="http://olafsblog.sysbsb.de/category/generics/feed/" rel="self" type="application/rss+xml" />
	<link>http://olafsblog.sysbsb.de</link>
	<description>Olaf&#039;s blog on software development and life</description>
	<lastBuildDate>Thu, 18 Nov 2010 07:57:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Typparameter einer generischen java-Klasse zur Laufzeit bestimmen</title>
		<link>http://olafsblog.sysbsb.de/typparameter-einer-generischen-java-klasse-zur-laufzeit-bestimmen/</link>
		<comments>http://olafsblog.sysbsb.de/typparameter-einer-generischen-java-klasse-zur-laufzeit-bestimmen/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 15:04:03 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[System architecture]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=30</guid>
		<description><![CDATA[Einer der etwas komplizierten Teile von Java generics ist der Umgang mit Typparametern zur Laufzeit.
Oftmals wird behauptet, dass es nicht möglich sei, den konkreten Typ eines Typ-Parameters zur Laufzeit zu erhalten. Das stimmt so aber nicht.

Nehmen wir folgende Klassen, wobei Entity und EntityImpl unwichtiger Beispielcode sind:


/**
 * Demonstrates the retrieval of a generic type parameters [...]]]></description>
			<content:encoded><![CDATA[<p>Einer der etwas komplizierten Teile von Java generics ist der Umgang mit Typparametern zur Laufzeit.<br />
Oftmals wird behauptet, dass es nicht möglich sei, den konkreten Typ eines Typ-Parameters zur Laufzeit zu erhalten. Das stimmt so aber nicht.<br />
<span id="more-30"></span><br />
Nehmen wir folgende Klassen, wobei Entity und EntityImpl unwichtiger Beispielcode sind:</p>
<pre class="brush: java;">

/**
 * Demonstrates the retrieval of a generic type parameters actual Class at runtime.
 *
 * @author Olaf Otto
 *
 * @param &lt;T&gt; the generic type.
 */
public abstract class AbstractDao&lt;T extends Entity&gt; {
    @SuppressWarnings(&quot;unchecked&quot;)
    public void foo() {
        Class&lt;T&gt; clazz = null;
        // Since we are targeting this class, we know it is a ParameterizedType.
        // We use getGenericSuperclass in this example since this class is abstract and the method will be invoked
        // on a directly derived class instance.
        ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass();
        Type[] typeArguments = pt.getActualTypeArguments();
        // Since we know the maximum number of type arguments (1), this check is sufficient.
        if (typeArguments != null &amp;&amp; typeArguments.length &gt; 0) {
            Type arg = typeArguments[0];
            if (arg instanceof Class) {
                clazz = (Class&lt;T&gt;) arg;
            }
        }
        System.out.println(&quot;Resolved generic type parameter to &quot; + clazz + &quot;.&quot;);
    }
}

/**
 * Dummy class for demonstration purposes.
*/
public class Entity {
}

/**
 *  Dummy class for demonstration purposes.
*/
public class SomeEntity extends Entity {

}
</pre>
<p>Ruft man jetzt innerhalb einer main-Methode oder eines Unit-Tests die Methode <code>foo()</code> auf einer <code>SomeEntity</code>-Instanz auf, so erhält man folgendes Ergebnis:<br />
<code><br />
Resolved generic type parameter to class my.package.name.SomeEntity.<br />
</code></p>
<p>Womit der Typparameter korrekt aufgelöst ist.</p>
<p>Zum Ausprobieren: die verwendete Main-Klasse.</p>
<pre class="brush: java;">
/**
 * A main method provider for demonstration purposes.
*/
public class Main {
    public static void main(String[] args) {
        SomeEntityDao dao = new SomeEntityDao();
        dao.foo();
    }
}
</pre>
<h3>Pro und contra</h3>
<p><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=208860">In einem Ähnlichen Posting zeigt Ian Robertson</a>, wie man diese Systematik unabhängig von der Vererbungshierarchie verwenden kann.<br />
In den <a href="http://www.artima.com/forums/flat.jsp?forum=106&#038;thread=208860">Kommentaren zu seinem Posting</a> wird diskutiert, warum man überhaupt so viel komplizierten utility-Code schreiben sollte, wenn man ebensogut einfach und sicher die Klasse des Typ-Parameters in der ableitenden Klasse bekannt machen kann &#8211; was letztendlich davon abhängt, an wie vielen unterschiedlichen Stellen im Code man die Typinformationen der Parameter benötigt.</p>
<h3>API Dokumentationen zum Posting:</h3>
<p><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/ParameterizedType.html">Die ParameterizedType API-Dokumentation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/typparameter-einer-generischen-java-klasse-zur-laufzeit-bestimmen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

