Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Generics: how to read actual type parameters

Reply
Thread Tools

Generics: how to read actual type parameters

 
 
marek.dudek@gmail.com
Guest
Posts: n/a
 
      09-30-2007
For example:

public class Pair<S> {

public Pair(S first, S second) {

this.first = first;
this.second = second;
}

public String toString() {
Class clas = ??? ;
return "Pair of " + clas.toString();
}

public S first;
public S second;
}

so that after instantiating

Pair<Double> p = new Pair<Double>( 0.0, 0.0 );

p.toString() gives "Pair of Double"

TIA

 
Reply With Quote
 
 
 
 
Joshua Cranmer
Guest
Posts: n/a
 
      09-30-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> For example:
>
> public class Pair<S> {
> public String toString() {
> Class clas = ??? ;
> return "Pair of " + clas.toString();
> }
> public S first;
> public S second;
> }
>

1. Don't use tabs in Usenet posts.
2. What you are probably intending to do is impossible as specified.
There is no possible way at runtime to get the class of S. Java erases
the types of the parameters at runtime.
3. Class is generic. Use Class<?> instead.

The easiest thing you can do is:
Class<?> clas = first.getClass();

A potentially tighter bound is:
Class<?> left = first.getClass();
Class<?> right = second.getClass();
Class<?> clas = left;

while (!clas.isAssignableFrom(right))
clas = clas.getSuperclass();

(This returns the last common ancestor of the classes of first and second)
--
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth
 
Reply With Quote
 
 
 
 
marek.dudek@gmail.com
Guest
Posts: n/a
 
      09-30-2007
Thank You a lot
Sorry for tabs

 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      09-30-2007
Joshua Cranmer wrote:
> (E-Mail Removed) wrote:
>> For example:
>>
>> public class Pair<S> {
>> public String toString() {
>> Class clas = ??? ;
>> return "Pair of " + clas.toString();
>> }
>> public S first;
>> public S second;
>> }
>>

> 1. Don't use tabs in Usenet posts.
> 2. What you are probably intending to do is impossible as specified.
> There is no possible way at runtime to get the class of S. Java erases
> the types of the parameters at runtime.
> 3. Class is generic. Use Class<?> instead.
>
> The easiest thing you can do is:
> Class<?> clas = first.getClass();
>
> A potentially tighter bound is:
> Class<?> left = first.getClass();
> Class<?> right = second.getClass();
> Class<?> clas = left;
>
> while (!clas.isAssignableFrom(right))
> clas = clas.getSuperclass();
>
> (This returns the last common ancestor of the classes of first and second)


Another hack in a class you own is to have a Class<?> instance variable to
provide runtime type information.

And here's a recent article I just googled up that delves into the issue (GIYF):
<http://www.artima.com/weblogs/viewpost.jsp?thread=208860>

--
Lew
 
Reply With Quote
 
Daniel Pitts
Guest
Posts: n/a
 
      10-01-2007
On Sep 30, 1:24 pm, Lew <(E-Mail Removed)> wrote:
> Joshua Cranmer wrote:
> > (E-Mail Removed) wrote:
> >> For example:

>
> >> public class Pair<S> {
> >> public String toString() {
> >> Class clas = ??? ;
> >> return "Pair of " + clas.toString();
> >> }
> >> public S first;
> >> public S second;
> >> }

>
> > 1. Don't use tabs in Usenet posts.
> > 2. What you are probably intending to do is impossible as specified.
> > There is no possible way at runtime to get the class of S. Java erases
> > the types of the parameters at runtime.
> > 3. Class is generic. Use Class<?> instead.

>
> > The easiest thing you can do is:
> > Class<?> clas = first.getClass();

>
> > A potentially tighter bound is:
> > Class<?> left = first.getClass();
> > Class<?> right = second.getClass();
> > Class<?> clas = left;

>
> > while (!clas.isAssignableFrom(right))
> > clas = clas.getSuperclass();

>
> > (This returns the last common ancestor of the classes of first and second)

>
> Another hack in a class you own is to have a Class<?> instance variable to
> provide runtime type information.
>
> And here's a recent article I just googled up that delves into the issue (GIYF):
> <http://www.artima.com/weblogs/viewpost.jsp?thread=208860>
>
> --
> Lew


Also, since Class is generified, you can do something like this:

class Pair<E> {
E first;
E second;
Class<E> type;

public Pair(Class<E> type) {
this.type = type;
}

public String toString() {
return "A pair of " + type.getName() + " objects: <" + first +
", " + second ">";
}
}

Although, I have to say its been my experience that toString is only
very useful for debug messages, and not for any real textual output
intended for the end user (in most cases). Especially a toString that
gathers runtime information "automagically".

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Type of actual ports is not compatible with type of ports of entity. mreister VHDL 1 05-25-2010 11:30 AM
How to get actual type parameters used in generics implementation? Todd Java 1 08-15-2008 06:03 PM
procedure and actual parameters Al VHDL 3 10-18-2006 02:54 PM
tool to check whether formal and actual parameters have similar names Amir Michail Python 2 08-10-2004 08:13 PM



Advertisments