this is the usecase we are talking about. i get a compile error, which sucks.
public class Test { public static void main(String[] args) { Foo foo = new FooImpl(); foo.foo(IntegerComponent.class); // ok foo.foo(Component.class); // compile error } public static class Component<T> {} public static class IntegerComponent extends Component<Integer> {} public static interface Foo { public void foo(Class< ? extends Component< ? >> clazz); } public static class FooImpl implements Foo { public void foo(Class< ? extends Component< ? >> clazz) {} } } -igor On Wed, May 14, 2008 at 11:56 PM, Sebastiaan van Erk <[EMAIL PROTECTED]> wrote: > Igor Vaynberg wrote: >> >> well, apparently johan ran into a situation where component<?> is too >> restrictive... > > As I understand it, Johan ran into a situation where Component<?> causes > *warnings* for users who use raw types. Which I've been arguing all along > that they SHOULD get: they should use Component<Object> or Component<Void> > instead of raw types, or live-with/suppress the warning. > > To make it clear, I made the following test class: > > public class Test<T> { > > public void doTest(Test<? extends Test<?>> test) { > System.out.println("test"); > } > > public static void main(String[] args) { > Test<Test<Integer>> test1 = newInstance(); // fine - no > warnings. > Test<Test> test2 = newInstance(); // not fine, use of raw > type, warning > Test test3 = newInstance(); // not fine, use of raw type, > warning > > test1.doTest(test1); // fine - no warnings. > test1.doTest(test2); // error - generic types don't match, > can be "fixed" by line below > test1.doTest((Test) test2); // warning - unchecked conversion > test1.doTest(test3); // warning - unchecked conversion > } > > public static <T> Test<T> newInstance() { > return new Test<T>(); > } > } > > As you can see, there is only one case when you get a compile error when > using the <? extends Test<?>> generic type, and that is a case where there > is on the user side an incorrect generic type: Test<Test>. The user here > declares he's using generics, but then inserts a raw type of a known generic > type - a situation that should not happen. > > Regards, > Sebastiaan > >> -igor >> >> >> On Wed, May 14, 2008 at 2:37 PM, Sebastiaan van Erk <[EMAIL PROTECTED]> >> wrote: >>> >>> Igor Vaynberg wrote: >>>> >>>> since then the thread has evolved into whether or not we should use <? >>>> extends Component> or <? extends Component<?>> >>>> >>>> -igor >>> >>> I don't understand how that changes any of my points. The first is >>> incorrect >>> (from a generics point of view) since you're referencing an >>> unparameterized >>> generic type. >>> >>> So the second gives warnings only in code that is not properly >>> generified... >>> >>> Regards, >>> Sebastiaan >>> >>> >>>> On Wed, May 14, 2008 at 1:54 PM, Sebastiaan van Erk >>>> <[EMAIL PROTECTED]> >>>> wrote: >>>>> >>>>> Igor Vaynberg wrote: >>>>> >>>>>> i do like generics. did i ever say otherwise? the problem here is that >>>>>> if we scope something as Class<? extends Component> then even though >>>>>> you ARE using generics in your code you will still get a warning >>>>>> because we did not scope the class as Class<? extends Component<?>>. >>>>>> >>>>>> on the other hand if we do scope it as Class<? extends Component<?>> >>>>>> then you can no longer pass a raw reference when calling the function. >>>>> >>>>> But that's exactly the point isn't it? If you're using generics then >>>>> you >>>>> shouldn't be using raw Components anymore... >>>>> >>>>>> so we are screwed if we do and we are screwed if we dont, i expected >>>>>> generics to be better. >>>>> >>>>> Well they definitely could have been better (erasure is terrible if you >>>>> ask >>>>> me), but I don't see what's wrong in this case. It warns you if you >>>>> should >>>>> be using a parameterized type but you don't. >>>>> >>>>>>> And especially if you look at the vote result, I think the majority >>>>>>> wants >>>>>>> the generics... >>>>>> >>>>>> that vote was before we uncovered this issue. we voted on the idea of >>>>>> generics, not on the implementation. >>>>> >>>>> That's true, but I wonder if this issue would change the vote much. I >>>>> don't >>>>> really understand why it's an issue, because you can use generified >>>>> Components always: Component<Object> if you don't want to constrain the >>>>> model object, and Component<Void> if you don't need a model. >>>>> >>>>> The question that started the thread was about StringResourceModel >>>>> which >>>>> was >>>>> not yet generified, and in that case, the warning seems to me to be >>>>> perfectly ok: it just says StringResourceModel should be generified. >>>>> It's >>>>> not a release yet, so that some users who use the current snapshot run >>>>> into >>>>> these kind of warnings which cannot be removed seems to be fine to >>>>> me... >>>>> >>>>> Regards, >>>>> Sebastiaan >>>>> >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]