Generic Methods Introduce Their Own Type Parameters
Apr 10, 2014
Generic methods are methods that introduce their own type parameters. This is similar to declaring a generic type, but the type parameter's scope is limited to the method where it is declared. Static and non-static generic methods are allowed, as well as generic class constructors.
1. The method is only exclusively to be used for the declared argument parameter? For example given a generic method:public static <String, Integer> boolean method(Pair<K, V> p1) {}I could only invoke the method if Pair argument parameter is <String, Integer>?
Got a problem with generics, which I'm still pretty new at. Here's a program that compiles fine:
import java.util.ArrayList; import javax.swing.JComponent; public class Experiments { public static void main(String[] args) { ListHolder holder = new ListHolder();
[Code] ....
It's useless, but it compiles. If I change Line 14, however, to add a generic type parameter to the ListHolder class, Line 10 no longer compiles:
import java.util.ArrayList; import javax.swing.JComponent; public class Experiments { public static void main(String[] args) { ListHolder holder = new ListHolder();
[Code] ....
I get this error:
Uncompilable source code - incompatible types: java.lang.Object cannot be converted to javax.swing.JComponent at experiments.Experiments.main(Experiments.java:10)
Apparently, the introduction of the type parameter leaves the compiler thinking that aList is of type Object. I can cast it, like this:
JComponent c = ((ArrayList<JComponent>)holder.aList).iterator().next();
That makes the compiler happy, but why is it necessary? How does adding the (unused) type parameter to the ListHolder class end up making the compiler think the aList member of an instance of ListHolder is of type Object?
It is important to note that the inference algorithm uses only invocation arguments, target types, and possibly an obvious expected return type to infer types. The inference algorithm does not use results from later in the program.
I have set up a project in Eclipse 3.1 and am using java 5.0 compiler.
Here's my folder structure in Eclipse
Java Code:
DFSRemoteClientTestClient.java mh_sh_highlight_all('java'); DFS is the project in Eclipse
And this is how it looks my java class
Java Code:
package RemoteClient; import java.util.*; // other imports public class TestClient { public static void main(String [] args) throws ServiceInvocationException { // business logic here .... } } mh_sh_highlight_all('java');
So, basically, my java class is just a simple class with a main function.
Now when I build my project, using Project->Clean...
Then I get this as an error at the very first line where i specify the package
This is the error:
Java Code: The type Class is not generic; it cannot be parameterized with arguments <T> mh_sh_highlight_all('java');
Is this the proper way to add to a generic list? My code works just fine, but I got this feeling that there might be some kind of flaw in it or something. Is this pretty much the basic way to add any type of data to a generic list?
import java.util.LinkedList; public class ListOfGeneric<E> { private LinkedList<E> myList;
So I have this class containing all my Enum types, also including methods for fetching Enum types based on their title attribute:
abstract class Enums { static private Landmass getLandmass(String name) { for ( Landmass l : Landmass.values( ) ) { if(l.title.equals(name)){ return l;
[Code] .....
The second method (getAttribute) is created by copy-paste and I also need to repeat this exercise with several other types of Enums. This seems like a waste of code however.
Instead, I thought I'd create a generic method for fetching any type of Enums. As far as I could follow the tutorial @ Oracle I need a generic class for this. Thus the EnumHelper class:
abstract class EnumHelper<T> { private T getEnum(T type, String name) { for ( type t : type.values( ) ) { if(t.title.equals(name)){ return t; } } return null; } }
This, however, doesn't compute:
horoscopeEnums.java:234: error: cannot find symbol for ( type t : type.values( ) ) { ^ symbol: class type location: class EnumHelper<T> where T is a type-variable:
[Code] ....
2 errors
To be honest I haven't been able to make much sense of the documentation on generics, thus its no surprise I'm stuck.
I am following this article [URL] .... till now I have made some code
This is my Interface
public interface Comparable<T> { public int compareTo(T o); }
And this is my class where I am using Bound Type Parameter on Generic Methods
public class GenericMethodBoundType { public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray)
[Code] .....
What else I need to do both in main method and at what parameterized types I need to pass at the class?
public class CollisionManager<T> { private boolean collision = false; private T mainEntity; public <T extends Entities> void handleCollision(T mainEntity, T secondEntity){ this.mainEntity = mainEntity; // This is illegal. } }
Why "this.mainEntity = mainEntity" is incorrect and also show me the correct way to achieve this?
The error I am getting is "Type mismatch: cannot convert T to T"
I'm working on an assignment where I need to take radius and height from the user to use with the methods in class Cylinder. I have to use radius and height as input parameters in the methods that calculate: Base area, lateral area, total area, and volume. But when I use height and radius as input parameters then it just prints zeros for all calculated values. When I remove (double radius) from the method it works just fine. So my question is how can I get this to work with radius/height as input parameters? Or am I just misunderstanding will they still be input parameters even if I don't have it written as (double radius) in the method?
The one problem in my book was to create a constructor for different shirt features, which I did and ran successfully. Out of curiosity, I also added other methods to see if it would run if the parameters were different from the constructor. It keeps giving me a constructor error. So, my question is, am I able to create a class that uses a constructor with parameters and other methods without errors? I'm guessing there's no reason to since it would be wasted space since the constructor could do it but was just curious if it's possible.
Is everything from the constructor down (in the class) and Shirt.oneShirt (in the main) just a waste of time?
Here's my example:
public class Shirt//class name. { int collarSize;//data field. int sleeveLength;//data field. int pocketNumber;//data field public final static String MATERIAL = "cotton";//final data field for material. public Shirt(int collarSize, int sleeveLength, int pocketNumber)//start of constructor. {
I've just been having a go at an exercise where I have to create and use a class called Point, with two fields of type double. I have to create some methods for it, one of which is a distanceTo(Point) method, that calculates the distance to another point. I've tried to keep the distanceTo(Point) method short so have created some other methods to use within the method. My question is about the getDistance() method that I've made. As you can see below, I've given it two parameters, which are references to values within two Point objects (this.x and otherPoint.x).
I have the following code in which I am looping through the rows of one array (composed of Strings) and copying it to another array. I am using .clone() to achieve this and it seems work as it changes the memory location of the rows themselves. I did notice that the String objects are still pointing to the same location in memory in both arrays but I won't worry about that for now, at the moment I just want to understand why the array I am cloning is not successfully assigning to the other array.
This is the incorrect line: ar[r] = maze[r].clone();
I'm building a pokemon battle simulator, as I mentioned in my previous post, and I'm starting from simplest game form and then adding complexities. right now I'm trying to give my pokemon multiple moves to randomly(for now) choose from. and I started with an int[] array that holds the magnitude of each move. But then it occurred to me that moves need to have multiple attributes like name, type, damage.. etc.. and also they can be acquired by more than one pokemon, and having them as an array would mean literally that I would have to make multiple arrays and it would involve a lot of repetitiveness.
So I settled on Objects, however the first challenge that faced me was, how to introduced the different types of moves? one one hand, I have healing moves,which acts on the pokemon's own health. on the other hand, I have attacking moves,which acts on the other pokemon's health. Given that both types of moves need to be in the same object array, I thought of polymorphism and created a superclass "Moves", which has HealingMoves and FightingMoves as subclasses, so both can be sent to the Moves[]. but since these moves have different effects, I had to make an new if statement that checks for class of move selected and based on that does different things. How the game's logic is going so far? is this the right way to introduce moves?
This is somewhat out of topic, but what is the difference between these two statements:
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class MyList<E> { 5 6 public List<E> list; 7 public int length;
[code]...
I am trying to define a class MyList, which i just a wrapper around an ArrayList, no real purpose, just for the sake of learning Generics. Idea here is that I create a parameterized class, MyList<E>, which holds a parameterized instance var of type List<E>. I have an add method which adds an element of type E to the List<E>. If I create an instance of MyList, call it 'm', for some reason when I try to call a method on that instance the compiler complains that 'm' cannot be found.
Basically I'm trying to code this program but I keep getting error can't be applied to given types. I know it has to do with my method trying to be called by an array, but I'm just kinda lost.
Write a program that prompts the user to input cash amounts and use a method to calculate the average amount for a week given 7 inputs of daily cash intake amounts for a cash register. Use an array to store the values. Recall that average is the sum of the values divided by the number of values. The method should take argument(s) of type double and return average weekly cash amount as a double.
Make sure you test your program using the test data given below and calls the averageCash() method defined above passing in the values. Verify that the input values are greater than or equal to 0. Negative numbers are not allowed. Output the values used and the averageCash value.
import java.util.*; public class ArrayHandout { public static void main(String args[]) { int[] a=new int[6]; Scanner sc=new Scanner(System.in);
If you have final int i = 1; short s = 1; switch(s) { case i: System.out.println(i); }
it runs fine. Note that the switch expression is of type short (2 bytes) and the case constant is of type int (4 bytes).My question is: Is the type irrelevant as long as the value is within the boundaries of the type of the switch expression?I have the feeling that this is true since:
byte b = 127; final int i = 127; switch(b) { case i: System.out.println(i); }
This runs fine again, but if I change the literal assigned to i to 128, which is out of range for type byte, then the compiler complains.Is it true that in the first example the short variable and in the second example the byte variable (the switch expressions) are first implicitly converted to an int and then compared with the case constants?
I've implemented Stack on the base of the LinkedList. It works as i expect it to work, but then i tried to made it compatible with foreach loop. I've implemented Iterable and Iterator. Code compiles and works fine, but does not return any output. It looks like while working with foreach, next() is not called at all. If i`m getting iterator from instance and try to do iterator.next(), i get output as expected.
public class genericStack<T> implements Iterator<T>, Iterable<T> { private LinkedList<T> LL ; protected genericStack() { this.LL = new LinkedList<T>(); } public static void main(String[] args) {
Trying to make a universal tool for increment an array by one while keeping all the previous values in place.
public K[] increment(K[] k){ int i = 0; K[] tmp = (K[])new Object[Array.getLength(k)+1]; /* * Parses through the passed k and fills tmp with all of ks values
I am trying to understand the concept of Generics in java. In the introduction to Generic Types, this example is given:
Java Code: public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } mh_sh_highlight_all('java'); "Since
Since its methods accept or return an Object, you are free to pass in whatever you want, provided that it is not one of the primitive types." - I understand this.But then it has been changed to a generic class:
Java Code: /** * Generic version of the Box class. * @param <T> the type of the value being boxed */ public class Box<T> { // T stands for "Type" private T t;
public void set(T t) { this.t = t; } public T get() { return t; } } mh_sh_highlight_all('java'); "
As you can see, all occurrences of Object are replaced by T. A type variable can be any non-primitive type you specify: any class type, any interface type, any array type, or even another type variable."We can use any type in place of an Object, because Object is a superclass of all classes. But T (or any other class) is not a superclass of all classes. So how do we justify any class being used in place of a random T or any other class?
I recently posted that JComboBox should be used in a generic manner. I presumed that once declared, with some type Foo, that one could then do:
Java Code:
JComboxBox<Foo> cb = new JComboBox<>(); // sometime later Foo foo = cb.getSelectedItem(); mh_sh_highlight_all('java');
However, getSelectedItem() is documented to return a type of Object so a cast is still needed. I can't understand (even for backward compatibility) why it doesn't return a type of the specified type. Many other old classes have been converted to generics so why should this be any different? I just found that one could use getPrototypeDisplayValue() but that seems counter intuitive.