Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / October 2007

Tip: Looking for answers? Try searching our database.

No coercion in for-each loop?

Thread view: 
Dave Stallard - 28 Oct 2007 01:31 GMT
OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
tools and my intolerance for Eclipse, but I've reconciled myself to it now).

Question: Eclipse gives me a compiler error for:

  List list = new ArrayList();
  for (String s : list)
    System.out.println(s);

It says "Type mismatch: Cannot convert from element type Object to
String".   It's fine if I change decl of list to List<String>, or coerce
list to List<String> in the loop decl;

Is this an *actual* compiler error in the Java spec?   Is Java actually
that hissy about the for-each variable?  The compiler doesn't mind the
code below, even though it causes a runtime type-cast error. So why
can't it insert the cast to String in the loop setup? Am I missing
something?

    Dave

    List ar = new ArrayList();
    ar.add(1);
    List<String> list = ar;   
    for (String s : list)
           Utils.log(s);
Lew - 28 Oct 2007 03:08 GMT
> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
> tools and my intolerance for Eclipse, but I've reconciled myself to it
> now).

So don't use Eclipse!

There are plenty of good alternatives, NetBeans to name one.

What does Eclipse have to do with what version of Java you use, and why are
other free tools not available to you?

Signature

Lew

Lew - 28 Oct 2007 03:11 GMT
> Question: Eclipse gives me a compiler error for:

Actually, Java gives you that error, not Eclipse.

>   List list = new ArrayList();
>   for (String s : list)
[quoted text clipped - 5 lines]
>
> Is this an *actual* compiler error in the Java spec?   Is Java actually

Yes.

> that hissy about the for-each variable?  The compiler doesn't mind the

"Hissy"?

Since when do we expect compilers to be imprecise?

> code below, even though it causes a runtime type-cast error. So why
> can't it insert the cast to String in the loop setup? Am I missing
> something?

You sure are.  The for-each idiom requires that the loop variable ('s' in your
example) be the same type as the base type of the array or collection.  The
base type of a raw List is Object, so
  for ( String s : list )
is not legal Java for list.  Remember that you are essentially declaring list
to be of type List<Object>, so the compiler has no knowledge that the base
type is meant to be String.

When you use a List<String>, the compiler knows the base type is String and
happily implements the intended for-each.

Signature

Lew

Arne Vajhøj - 28 Oct 2007 04:02 GMT
>> Question: Eclipse gives me a compiler error for:
>
> Actually, Java gives you that error, not Eclipse.

It is worth noting though that Eclipse uses its own compiler not
a standard JDK compiler.

Arne
Lew - 28 Oct 2007 04:18 GMT
Dave Stallard wrote:
>>> Question: Eclipse gives me a compiler error for:

Lew wrote:
>> Actually, Java gives you that error, not Eclipse.

> It is worth noting though that Eclipse uses its own compiler not
> a standard JDK compiler.

I did not assert otherwise, only that it is the rules of the Java language
that determined the error.  The Eclipse compiler is "a standard JDK compiler"
in the sense that it complies with the Java standard.  Since the code was not
legal Java, one should not walk away thinking it's only Eclipse that would object.

Signature

Lew

Dave Stallard - 28 Oct 2007 04:27 GMT
>> that hissy about the for-each variable?  The compiler doesn't mind the
>
> "Hissy"?

Yes, "hissy".

> Since when do we expect compilers to be imprecise?

We don't expect them to be imprecise.  We expect them to do things
automatically for us, rather than make us do them.  That's what
compilers are for.  In this case, the compiler has all the knowledge it
needs right there in the code to insert the cast *itself*.   It has the
declaration of the iteration variable as String.  It can see that the
list variable is a raw-type list:

  for (String s : (List<String>)l) ...

It's the same mentality that forces us to write:

  Foo f = (Foo)..expression..

It sees that f is a Foo.  It doesn't know that expression is a Foo.  So
it can see that a typecast is needed, and even tells you so.  But it
makes YOU type it in.  What sense is there in that?   It should at most
be a compiler warning, not an error.   This may seem small, but iterated
millions of times over one's life span, it becomes very annoying.  It's
one of the things that's making people rail against "strong typing", and
driving them to scripting languages like Ruby.  Strong typing is good;
unnecessary typing (pun intended) is not.

What's more, it's not even consistent, as I showed in the other snippet.
  It's still possible to generate run-time class cast exceptions

>> can't it insert the cast to String in the loop setup? Am I missing
>> something?
>
> You sure are.  The for-each idiom requires that the loop variable ('s'

No, you're missing something.  This rule means that in order to use the
for-each loop in a useful way, you have to buy into Java generics!
That's no good.  So the one thing they did to make your life easier, and
should have done from the beginning - obviating the need for Iterator
everywhere - they f.cked up.

By the way, and I don't mean to wound your feelings here, but in C# this
 works fine.  Oh, and they also give you '[]' for array fetching like a
NORMAL programming language.

Don't get me wrong. I still use Java for its compatibility on Windows
and Linux, and for its now-quite-respectable speed relative to C++.  I
used it back when no one else in my group used it, and I will continue
to use it.  But with respect to Java's progress as a *programming
language* I am bitterly disappointed.

  Dave
Lew - 28 Oct 2007 04:48 GMT
>>> that hissy about the for-each variable?  The compiler doesn't mind the

Lew wrote:
>> "Hissy"?

> Yes, "hissy".  [and more]

Take it easy, man.  The Java language is what it is, just like Basic is what
it is.  It violates the rules of Java to ask a for-each to infer that a
List<Object> holds all Strings.  That's the language.

> No, you're missing something.  This rule means that in order to use the for-each loop in a useful way, you have to buy into Java generics! That's no good.  So the one thing they did to make your life easier, and should have done from the beginning - obviating the need for Iterator everywhere - they f.cked up.

"buy into"?

The for-each loop was introduced with generics, and they are meant to go
together.  The fact that they work well with each other isn't a bad thing,
it's a good thing.

No one is saying Java is perfect, but the rules of the language are clear.
Rant all you like, the fact is that if you want for ( String s : coll ) to
work, the collection must be declared with the base type <String>.  It's a
shame if you don't like it, but sometimes reality bites.

Signature

Lew

rossum - 28 Oct 2007 11:20 GMT
>We don't expect them to be imprecise.  We expect them to do things
>automatically for us, rather than make us do them.  That's what
>compilers are for.  
We expect compilers to conform to the language specification, which
the Java compiler does.

>In this case, the compiler has all the knowledge it
>needs right there in the code to insert the cast *itself*.   It has the
[quoted text clipped - 11 lines]
>makes YOU type it in.  What sense is there in that?   It should at most
>be a compiler warning, not an error.
Java is a strongly typed language.  If you do not like the effects of
strong typing then don't use a strongly typed language, use Python or
whatever instead.

rossum
Mike Schilling - 28 Oct 2007 17:10 GMT
>>> that hissy about the for-each variable?  The compiler doesn't mind
>>> the
[quoted text clipped - 7 lines]
> We don't expect them to be imprecise.  We expect them to do things
> automatically for us, rather than make us do them.

But Java doesn't insert casts automatically[1], and never has.

   Object o;
   String s = o;

won't compile.  Why would you expect different behavior in a for loop?

1. Except to the extent that generics are implemented by doing so.
Roedy Green - 28 Oct 2007 22:43 GMT
On Sun, 28 Oct 2007 09:10:51 -0700, "Mike Schilling"
<mscottschilling@hotmail.com> wrote, quoted or indirectly quoted
someone who said :

>    Object o;
>    String s = o;
>
>won't compile.  Why would you expect different behavior in a for loop?
>
>1. Except to the extent that generics are implemented by doing so.

2. autoboxing-unboxing which is can't be done with a cast, but is in
the same spirit.

One of my early flames at Java was the lack of orthogonality in
conversions.  I figured if you wanted to specially mark them, either
they should all be done with (convert) or with (anytype).

After experiences with PL/1 which will automatically provide a
conversion from pretty well anything to anything without comment using
the most improbable and practically useless algorithm, I am a firm
believer in explicitly marking conversions. I just think they should
be more symmetrical than French irregular verbs.

I wrote http://mindprod.com/applet/converter.html to help me remember
how to convert a to b.  I STILL use it after all these years.

Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Mike Schilling - 29 Oct 2007 02:02 GMT
> On Sun, 28 Oct 2007 09:10:51 -0700, "Mike Schilling"
> <mscottschilling@hotmail.com> wrote, quoted or indirectly quoted
[quoted text clipped - 19 lines]
> the most improbable and practically useless algorithm, I am a firm
> believer in explicitly marking conversions.

Oh yes.  In fact, PL/I proved (by trying and failing miserably) that even
among the usual kind of numeric types, there's no way to construct a system
of conversions that's internally consistent and whose results are always
intuitive.  Even a type system as simple as XPath 1.0's show this.  It has
three scalar types (plus a non-scalar type that's a set of XML nodes.)

1. Numeric (double)
2. Boolean (true/false)
3. String (Unicode characters; can be empty but never null.)

Each has a standard value to which an empty node set automatically
converts:

1. 0.0
2. false
3 the empty string

Conversions among scalar types *almost* work:

1. 0.0 -> false, 0.0 -> empty string
2. false -> 0.0, false -> "false"
3. empty string -> 0.0, empty string -> false

The problem is that the string "false" causes an exception when converted to
a number, and becomes true when converted to a boolean (because it's
non-empty.)
Arne Vajhøj - 29 Oct 2007 02:17 GMT
> But Java doesn't insert casts automatically[1], and never has.
>
>     Object o;
>     String s = o;
>
> won't compile.  Why would you expect different behavior in a for loop?

Why not ?

:-)

To illustrate - in C# the following is not valid:

object o = 123;
int i = o;

but this is:

object[] os = { 123, "abc" };
foreach(int i1 in os)
{
    Console.WriteLine(i1);
}

(valid = it compiles, runtime we of course get InvalidCastException,
but if the cast was valid for all elements it would run fine)

You may prefer the Java way over the C# way, but there are
no rule saying that single assignment and for loop need to have
the same casting rules.

Arne
Mike Schilling - 29 Oct 2007 06:03 GMT
>> But Java doesn't insert casts automatically[1], and never has.
>>
[quoted text clipped - 23 lines]
> (valid = it compiles, runtime we of course get InvalidCastException,
> but if the cast was valid for all elements it would run fine)

Not that I distrust you, but I had to try that for myself to be sure:-)
Whoa.

> You may prefer the Java way over the C# way, but there are
> no rule saying that single assignment and for loop need to have
> the same casting rules.

Other than "least astonishment", anyway.
Arne Vajhøj - 30 Oct 2007 01:53 GMT
>> To illustrate - in C# the following is not valid:
>>
[quoted text clipped - 14 lines]
> Not that I distrust you, but I had to try that for myself to be sure:-)
> Whoa.

It is worth noting that for C# then foreach came before generics.

Implicit casting makes nicer code when generics is not
available.

Arne
Mike Schilling - 30 Oct 2007 02:05 GMT
>>> To illustrate - in C# the following is not valid:
>>>
[quoted text clipped - 19 lines]
> Implicit casting makes nicer code when generics is not
> available.

True.  Now I'm wondering about the following code:  (make a prediction
before you try it)

using System;

class MainClass
{
 public static void Main(String[] args)
 {
   object[] os = { 123, 456.23 };
   foreach(int i1 in os)
   {
        Console.WriteLine(i1);
   }

 }
}

And the answer is ...... it throws an exception.  An implicit cast is done,
but not an implicit conversion.
Arne Vajhøj - 30 Oct 2007 02:22 GMT
>     object[] os = { 123, 456.23 };
>     foreach(int i1 in os)
>     {
>          Console.WriteLine(i1);
>     }

> And the answer is ...... it throws an exception.  An implicit cast is done,
> but not an implicit conversion.

I think that is very similar to:

    object o = 456.23;
    int i = (int)o;

throwing exception but:

    object o = 456.23;
    int i = (int)(double)o;

working.

Arne
Mike Schilling - 30 Oct 2007 02:47 GMT
>>     object[] os = { 123, 456.23 };
>>     foreach(int i1 in os)
[quoted text clipped - 16 lines]
>
> working.

I expect the mechanisms are identical.
Mark Rafn - 28 Oct 2007 03:38 GMT
>OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
>tools and my intolerance for Eclipse, but I've reconciled myself to it now).

Umm, there's LOTs of alternatives to eclipse.  You can still use
vi/emacs/notepad if you're so inclined.

>Question: Eclipse gives me a compiler error for:
>   List list = new ArrayList();
[quoted text clipped - 3 lines]
>String".   It's fine if I change decl of list to List<String>, or coerce
>list to List<String> in the loop decl;

Right.  The java compiler doesn't do as much type inference as it could,
unfortunately.

>Is this an *actual* compiler error in the Java spec?

Umm, how hard is this to check for yourself?  Seriously - you can't go saying
you dislike eclipse then not spend the 2 minutes (tops!) it takes to make a
test case and hit it with javac.

>Is Java actually that hissy about the for-each variable?

Short answer: yes.  It's hissy about casting things you haven't told it to.  

>doesn't mind the code below, even though it causes a runtime type-cast error.

Well, there you go.  The whole point of generics is to make it easier to write
code that does NOT get runtime cast errors.
--
Mark Rafn    dagon@dagon.net    <http://www.dagon.net/>
Patricia Shanahan - 28 Oct 2007 06:32 GMT
> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
> tools and my intolerance for Eclipse, but I've reconciled myself to it
[quoted text clipped - 5 lines]
>   for (String s : list)
>     System.out.println(s);

You are required to make the variable match the base type of the
collection or array in this case Object, but you can do what you like
with each value:

for (Object o : list){
  String s = (String)o;
  ...
}

Patricia
Chronic Philharmonic - 28 Oct 2007 07:03 GMT
>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
>> tools and my intolerance for Eclipse, but I've reconciled myself to it
[quoted text clipped - 14 lines]
>   ...
> }

Or, you could say

for (Object o : list){
  String s = o.toString();
  ...
}

since all objects support toString, including um, Strings. Of course, this
only works for Strings, but Strings are pretty common in the wild.
Patricia Shanahan - 28 Oct 2007 07:06 GMT
>>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
>>> tools and my intolerance for Eclipse, but I've reconciled myself to it
[quoted text clipped - 23 lines]
> since all objects support toString, including um, Strings. Of course, this
> only works for Strings, but Strings are pretty common in the wild.

The downside of that approach is that if something has gone wrong, and
the List accidentally contains an Integer, there will be no exception
and the program will go on running, possibly with nonsense data.

I would only do it if I really meant that it was OK for any reference
type to be in the List and I just wanted to work with its toString
representation.

Patricia
Chronic Philharmonic - 28 Oct 2007 09:36 GMT
>>>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
>>>> tools and my intolerance for Eclipse, but I've reconciled myself to it
[quoted text clipped - 27 lines]
> the List accidentally contains an Integer, there will be no exception
> and the program will go on running, possibly with nonsense data.

Fortunately, generics make this approach and the need for typecasting mostly
obsolete.

> I would only do it if I really meant that it was OK for any reference
> type to be in the List and I just wanted to work with its toString
> representation.

I tend to do this when I just want to enumerate the contents of a list and
print a description to System.out or a logger.
Daniel Pitts - 28 Oct 2007 17:24 GMT
>>>>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
>>>>> tools and my intolerance for Eclipse, but I've reconciled myself to it
[quoted text clipped - 35 lines]
> I tend to do this when I just want to enumerate the contents of a list and
> print a description to System.out or a logger.

If thats the case, you'll get more NPEs than by using String.valueOf(o);

Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Chronic Philharmonic - 28 Oct 2007 18:03 GMT
>>>>>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with
>>>>>> available tools and my intolerance for Eclipse, but I've reconciled
[quoted text clipped - 36 lines]
>> and print a description to System.out or a logger.
> If thats the case, you'll get more NPEs than by using String.valueOf(o);

All engineering is a compromise. For some things casting is better. For
others, using o.toString polymorphism is better. In a vacuum, I cannot say
which would be better. It depends on the design, how the collection is being
used, whether you expect nulls in the collection, whether you control the
things you put in the collection, etc. etc. etc. The o.toString pattern is
one of many that I keep in my arsenal. I find it useful at times.
Daniel Pitts - 28 Oct 2007 18:24 GMT
>>>>>>> OK, I finally caught up to Java 1.5/6.  (Delay had to do with
>>>>>>> available tools and my intolerance for Eclipse, but I've reconciled
[quoted text clipped - 41 lines]
> things you put in the collection, etc. etc. etc. The o.toString pattern is
> one of many that I keep in my arsenal. I find it useful at times.

I didn't suggest using casting at all.
String.valueOf(o) is a null-safe way of handling o.toString(). It still
relies on polymorphism, but handles the "null" reference in a safer way.

Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Chronic Philharmonic - 28 Oct 2007 22:19 GMT
[snip]

>> All engineering is a compromise. For some things casting is better. For
>> others, using o.toString polymorphism is better. In a vacuum, I cannot
[quoted text clipped - 6 lines]
> String.valueOf(o) is a null-safe way of handling o.toString(). It still
> relies on polymorphism, but handles the "null" reference in a safer way.

Ok. Sorry.
Ben Phillips - 29 Oct 2007 00:31 GMT
> I didn't suggest using casting at all.
> String.valueOf(o) is a null-safe way of handling o.toString(). It still
> relies on polymorphism, but handles the "null" reference in a safer way.

Except, of course, if the compile-time type of the expression 'o' here
is compatible with char[] ...
crazzybugger - 28 Oct 2007 11:13 GMT
> OK, I finally caught up to Java 1.5/6.  (Delay had to do with available
> tools and my intolerance for Eclipse, but I've reconciled myself to it now).
[quoted text clipped - 22 lines]
>         for (String s : list)
>             Utils.log(s);

It is true that the compiler does not mind when you code
List<String> list=ar even though ar may contain non String objects. It
does so because, you are knowingly doing it and telling the compiler,
"See compiler, I am sure this list contains only String items and if
any error occurs I will manage it". However, when you try
List ar=new ArrayList()l
for(String s: ar)
Utils.log(s);
The compiler wont make any stupid assumptions, it wont cast Object
into a String since its not the kind of job compiler will do
implicitly!!! Compiler is not an AI machine and second, it does what
you tell it to do. Also generics are just compile time features, the
information is not present in the run time. So stop complaining and
start thinking.
Bent C Dalager - 28 Oct 2007 11:44 GMT
>>         List ar = new ArrayList();
>>         ar.add(1);
[quoted text clipped - 7 lines]
>"See compiler, I am sure this list contains only String items and if
>any error occurs I will manage it".

I don't see that you are saying this in the above code. What you are
saying is "As far as I recall, 'ar' is actually a List<String> so this
should work a treat" - much as if you had written
Object o = ...;
String text = o;

The compiler doesn't accept the latter, why should it accept the
former? Shouldn't it /require/ you to write
List<String> list = (List<String>) ar;
in the same way that it requires
String text = (String) o;
?

(Not that the cast would do you any good though, since
      List ar = new ArrayList<Integer>();
      ar.add(1);
      List<String> list = (List<String>) ar;
      for (String s : list)
           System.out.println(s);

doesn't actually barf on the cast, but on the for statement. This
might be the reason I suppose - Java doesn't require the explicit cast
because it's unable to verify it anyway. This doesn't really improve
the situation in my eyes. But we may just be rehashing old complaints
about the generics system here.)

Cheers,
    Bent D
Signature

Bent Dalager - bcd@pvv.org - http://www.pvv.org/~bcd
                                   powered by emacs

Roedy Green - 28 Oct 2007 12:35 GMT
On Sat, 27 Oct 2007 20:31:18 -0400, Dave Stallard
<stallard@nospam.net> wrote, quoted or indirectly quoted someone who
said :

>   List list = new ArrayList();
>   for (String s : list)
>     System.out.println(s);
>
>It says "Type mismatch: Cannot convert from element type Object to
>String".  

It is indeed a type mismatch. By avoiding declaring the type of
ArrayList with a generic, the type is the default Object.

So you to use the for:each syntax, you would have to say:

for ( Object o: list  )
 {
 System.out.println( o );
 }

or
 System.out.println( o.toString() );

or
 System.out.println( (String) o );

But the most idiomatic and no-run-time-overhead way is to use the ugly
<String> Syntax to declare:

List<String> list = new ArrayList<String>();
for ( String s : list )
{
System.out.println( s );
}
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Daniel Pitts - 28 Oct 2007 17:31 GMT
> On Sat, 27 Oct 2007 20:31:18 -0400, Dave Stallard
> <stallard@nospam.net> wrote, quoted or indirectly quoted someone who
[quoted text clipped - 9 lines]
> It is indeed a type mismatch. By avoiding declaring the type of
> ArrayList with a generic, the type is the default Object.

Actually, there is a difference between declaring things with List<?>,
List, and List<Object>
Where the generic type appears, they all look like Objects, but

This whole thread is probably best answered by Sun's Generics Tutorial
on how to deal with legacy code.
<http://java.sun.com/docs/books/tutorial/extra/generics/legacy.html>

Hope this helps,
Daniel.
Signature

Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Joshua Cranmer - 28 Oct 2007 19:19 GMT
>   List list = new ArrayList();
>   for (String s : list)
[quoted text clipped - 3 lines]
> String".   It's fine if I change decl of list to List<String>, or coerce
> list to List<String> in the loop decl;

Since many people have already belabored the correct answer to death, I
will attempt to merely provide another avenue for your pondering.

(Definitions, etc., provided from JLS 3 §14.14.2)

Outside the context of the arrays, the foreach loop boils down to this:

for ( VariableModifiers_opt Type Identifier: Expression)

The `Expression', if not an array, must be an object of type `Iterable'.

For Iterable types, the for statement becomes equivalent to this statement:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
   VariableModifiers_opt Type Identifier = #i.next();
   // Rest of loop
}

where #i is a unique, unused identifier, and I is the type of
Expression.iterator(). So in your case, this is the transformed for loop:

for (Iterator #i = list.iterator(); #i.hasNext(); ) {
   String s = #i.next();
   System.out.println(s);
}

Since the return type of the raw Iterator.next() function is an Object,
you would have a compile-time cast exception in the transformed for
loop, and therefore you have one in the foreach loop.

> The compiler doesn't mind the
> code below, even though it causes a runtime type-cast error.

It does mind it: it throws an unchecked warning on the conversion
between list and ar, as required by JLS 3, §5.1.9

> So why can't it insert the cast to String in the loop setup? Am I
> missing something?

From JLS 3, §5.1.9:
Unchecked conversion is used to enable a smooth interoperation of legacy
code, written before the introduction of generic types, with libraries
that have undergone a conversion to use genericity (a process we call
generification).
[...]
While the conversion is unsound, it is tolerated as a concession to
practicality.

Without the generics, the compiler is forced to work off of the raw
return type of List's iterator method: Object. Since the conversion to
String cannot be verified.

Your setup uses inherently unsafe code to begin with: the compiler only
accepts it because to not do so would break too much code (hence the quote).

Since the introduction of foreach and generics go hand-in-hand, there is
no need to tolerate such unsound conversions.

Signature

Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.