On Wed, Sep 25, 2013 at 2:07 PM, Benedikt Ritter <[email protected]> wrote:

> 2013/9/24 Matt Benson <[email protected]>
>
> > On Sep 24, 2013 10:48 AM, "Benedikt Ritter" <[email protected]>
> wrote:
> > >
> > > Hi Matt,
> > >
> > > > Am 24.09.2013 um 01:24 schrieb Matt Benson <[email protected]>:
> > > >
> > > > <grumpy>
> > > >  This is why I submitted this in JIRA first and let it sit Friday
> > > > afternoon, all weekend, and basically all day Monday before
> committing.
> > > > </grumpy>
> > >
> > > Although I'm subscribed to the jira ML, I don't follow the list as
> > careful as I follow the dev ML. Since you seem to have been unsure about
> > whether to add this feature or not, maybe you should have asked for
> > opinions on the dev ML first.
> >
> > Well, we're here now. What's your opinion?
> >
>
> To be honest I'm undecided here. I'd say if we need this for other API
> functionality it can stay. For now it feels not only like a replication of
> CDI, but also of other OSS libs as you have pointed out :-)
>
> TypeLiteral is quite incidental to CDI or this wouldn't be an issue.  If
you want to write a typesafe API that deals to any great extent with the
relationships between types, you need some type with which to parameterize
your API methods in the same manner as Class<T>.  That is the reason for
the duplication elsewhere.


> OTOH it's bad to have a swiss army knife that's missing a screwdriver...
>

Nice analogy.  If any non-core Java library is in place for its types to
become de facto standards, it's [lang] or guava IMO.  [lang] is much
smaller so would be my natural choice for a dependency when designing a
library (I personally take [lang] as a given for any other project I work
on, which I continue to say is the whole mission of this component).  I
look on providing TypeLiteral as equivalent to providing Pair, which in
fairness I also was responsible for:  it may or may not be used directly by
[lang], but it's such a common need (hmm, "common") that it deserves a home
here.

Matt


>
> >
> > Matt
> >
> > >
> > > Regards,
> > > Benedikt
> > >
> > > >
> > > > IMO the CDI API, however small in binary terms, is a rather large
> > > > dependency *conceptually*.  In just a few minutes I have dug up three
> > > > similar OSS classes [1, 2, 3] I remember having encountered (not
> > including
> > > > my own, from which the proposed changes were extracted) whose
> existence
> > > > seems to support me in this opinion.  I wouldn't be at all surprised
> to
> > > > find more out there.  I reiterate that [lang]'s mission is to provide
> > where
> > > > Java SE is lacking.  Finally, the suggested change arguably improves
> > upon
> > > > other solutions by providing an abstraction in terms of which
> > TypeLiteral
> > > > instances can be handled compatibly with user custom types.  I submit
> > that
> > > > these comprise the "good argument" you have requested.
> > > >
> > > > Matt
> > > > [1]
> > > >
> >
> >
> http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/reflect/TypeToken.html
> > > > [2]
> > > >
> >
> >
> http://fasterxml.github.io/jackson-core/javadoc/2.2.0/com/fasterxml/jackson/core/type/TypeReference.html
> > > > [3]
> > > >
> >
> >
> https://code.google.com/p/orika/source/browse/trunk/core/src/main/java/ma/glasnost/orika/metadata/TypeBuilder.java
> > > >
> > > >
> > > > On Mon, Sep 23, 2013 at 5:53 PM, Gary Gregory <
> [email protected]
> > >wrote:
> > > >
> > > >> I think might -1 unless a good argument is made to start duplicating
> > Java
> > > >> EE classes. Is it that hard to depend on
> > > >>
> > > >>
> >
> >
> http://search.maven.org/remotecontent?filepath=javax/enterprise/cdi-api/1.0-SP4/cdi-api-1.0-SP4.jar(or
> > > >> a jar like it) for 50K?
> > > >>
> > > >> Gary
> > > >>
> > > >>
> > > >>> On Mon, Sep 23, 2013 at 6:13 PM, <[email protected]> wrote:
> > > >>>
> > > >>> Author: mbenson
> > > >>> Date: Mon Sep 23 22:13:57 2013
> > > >>> New Revision: 1525711
> > > >>>
> > > >>> URL: http://svn.apache.org/r1525711
> > > >>> Log:
> > > >>> [LANG-919] Provide TypeLiteral class similar to
> > > >>> javax.enterprise.util.TypeLiteral
> > > >>>
> > > >>> Added:
> > > >>>
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
> > > >>>
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java
> > > >>>  (with props)
> > > >>>
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
> > > >>>
> > > >>> Added:
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
> > > >>> URL:
> > > >>>
> > > >>
> >
> >
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java?rev=1525711&view=auto
> > > >>>
> > > >>>
> > > >>
> >
> >
> ==============================================================================
> > > >>> ---
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
> > > >>> (added)
> > > >>> +++
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
> > > >>> Mon Sep 23 22:13:57 2013
> > > >>> @@ -0,0 +1,79 @@
> > > >>> +/*
> > > >>> + * Licensed to the Apache Software Foundation (ASF) under one or
> > more
> > > >>> + * contributor license agreements.  See the NOTICE file
> distributed
> > with
> > > >>> + * this work for additional information regarding copyright
> > ownership.
> > > >>> + * The ASF licenses this file to You under the Apache License,
> > Version
> > > >> 2.0
> > > >>> + * (the "License"); you may not use this file except in compliance
> > with
> > > >>> + * the License.  You may obtain a copy of the License at
> > > >>> + *
> > > >>> + *      http://www.apache.org/licenses/LICENSE-2.0
> > > >>> + *
> > > >>> + * Unless required by applicable law or agreed to in writing,
> > software
> > > >>> + * distributed under the License is distributed on an "AS IS"
> BASIS,
> > > >>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > > >>> implied.
> > > >>> + * See the License for the specific language governing permissions
> > and
> > > >>> + * limitations under the License.
> > > >>> + */
> > > >>> +package org.apache.commons.lang3.reflect;
> > > >>> +
> > > >>> +import java.lang.reflect.Type;
> > > >>> +import java.lang.reflect.TypeVariable;
> > > >>> +
> > > >>> +import org.apache.commons.lang3.Validate;
> > > >>> +
> > > >>> +/**
> > > >>> + * Type literal comparable to {@code
> > javax.enterprise.util.TypeLiteral},
> > > >>> + * made generally available outside the JEE context. Allows the
> > passing
> > > >>> around of
> > > >>> + * a "token" that represents a type in a typesafe manner, as
> opposed
> > to
> > > >>> + * passing the (non-parameterized) {@link Type} object itself.
> > > >>> + * Additionally {@link TypeLiteral} implements the {@link Typed}
> > > >>> interface which
> > > >>> + * is a generalization of this concept. It is suggested that APIs
> be
> > > >>> defined in
> > > >>> + * terms of the interface, which others might implemented in
> custom
> > > >>> classes.
> > > >>> + */
> > > >>> +public abstract class TypeLiteral<T> implements Typed<T> {
> > > >>> +
> > > >>> +    @SuppressWarnings("rawtypes")
> > > >>> +    private static final TypeVariable<Class<TypeLiteral>> T =
> > > >>> TypeLiteral.class.getTypeParameters()[0];
> > > >>> +
> > > >>> +    /**
> > > >>> +     * Represented type.
> > > >>> +     */
> > > >>> +    public final Type value;
> > > >>> +
> > > >>> +    private final String toString;
> > > >>> +
> > > >>> +    protected TypeLiteral() {
> > > >>> +        this.value =
> > > >>> +
>  Validate.notNull(TypeUtils.getTypeArguments(getClass(),
> > > >>> TypeLiteral.class).get(T),
> > > >>> +                "%s does not assign type parameter %s",
> getClass(),
> > > >>> TypeUtils.toLongString(T));
> > > >>> +
> > > >>> +        this.toString = String.format("%s<%s>",
> > > >>> TypeLiteral.class.getSimpleName(), TypeUtils.toString(value));
> > > >>> +    }
> > > >>> +
> > > >>> +    @Override
> > > >>> +    public final boolean equals(Object obj) {
> > > >>> +        if (obj == this) {
> > > >>> +            return true;
> > > >>> +        }
> > > >>> +        if (obj instanceof TypeLiteral == false) {
> > > >>> +            return false;
> > > >>> +        }
> > > >>> +        final TypeLiteral<?> other = (TypeLiteral<?>) obj;
> > > >>> +        return TypeUtils.equals(value, other.value);
> > > >>> +    }
> > > >>> +
> > > >>> +    @Override
> > > >>> +    public int hashCode() {
> > > >>> +        return 37 << 4 | value.hashCode();
> > > >>> +    }
> > > >>> +
> > > >>> +    @Override
> > > >>> +    public String toString() {
> > > >>> +        return toString;
> > > >>> +    }
> > > >>> +
> > > >>> +    @Override
> > > >>> +    public Type getType() {
> > > >>> +        return value;
> > > >>> +    }
> > > >>> +}
> > > >>>
> > > >>> Added:
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java
> > > >>> URL:
> > > >>>
> > > >>
> >
> >
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java?rev=1525711&view=auto
> > > >>>
> > > >>>
> > > >>
> >
> >
> ==============================================================================
> > > >>> ---
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java
> > > >>> (added)
> > > >>> +++
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java
> > > >>> Mon Sep 23 22:13:57 2013
> > > >>> @@ -0,0 +1,32 @@
> > > >>> +/*
> > > >>> + * Licensed to the Apache Software Foundation (ASF) under one or
> > more
> > > >>> + * contributor license agreements.  See the NOTICE file
> distributed
> > with
> > > >>> + * this work for additional information regarding copyright
> > ownership.
> > > >>> + * The ASF licenses this file to You under the Apache License,
> > Version
> > > >> 2.0
> > > >>> + * (the "License"); you may not use this file except in compliance
> > with
> > > >>> + * the License.  You may obtain a copy of the License at
> > > >>> + *
> > > >>> + *      http://www.apache.org/licenses/LICENSE-2.0
> > > >>> + *
> > > >>> + * Unless required by applicable law or agreed to in writing,
> > software
> > > >>> + * distributed under the License is distributed on an "AS IS"
> BASIS,
> > > >>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > > >>> implied.
> > > >>> + * See the License for the specific language governing permissions
> > and
> > > >>> + * limitations under the License.
> > > >>> + */
> > > >>> +package org.apache.commons.lang3.reflect;
> > > >>> +
> > > >>> +import java.lang.reflect.Type;
> > > >>> +
> > > >>> +/**
> > > >>> + * Generalization of "has a type."
> > > >>> + */
> > > >>> +public interface Typed<T> {
> > > >>> +
> > > >>> +    /**
> > > >>> +     * Get the {@link Type} represented by this entity.
> > > >>> +     *
> > > >>> +     * @return Type
> > > >>> +     */
> > > >>> +    Type getType();
> > > >>> +}
> > > >>>
> > > >>> Propchange:
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java
> > > >>>
> > > >>>
> > > >>
> >
> >
> ------------------------------------------------------------------------------
> > > >>>    svn:executable = *
> > > >>>
> > > >>> Added:
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
> > > >>> URL:
> > > >>>
> > > >>
> >
> >
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java?rev=1525711&view=auto
> > > >>>
> > > >>>
> > > >>
> >
> >
> ==============================================================================
> > > >>> ---
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
> > > >>> (added)
> > > >>> +++
> > > >>>
> > > >>
> >
> >
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
> > > >>> Mon Sep 23 22:13:57 2013
> > > >>> @@ -0,0 +1,56 @@
> > > >>> +/*
> > > >>> + * Licensed to the Apache Software Foundation (ASF) under one or
> > more
> > > >>> + * contributor license agreements.  See the NOTICE file
> distributed
> > with
> > > >>> + * this work for additional information regarding copyright
> > ownership.
> > > >>> + * The ASF licenses this file to You under the Apache License,
> > Version
> > > >> 2.0
> > > >>> + * (the "License"); you may not use this file except in compliance
> > with
> > > >>> + * the License.  You may obtain a copy of the License at
> > > >>> + *
> > > >>> + *      http://www.apache.org/licenses/LICENSE-2.0
> > > >>> + *
> > > >>> + * Unless required by applicable law or agreed to in writing,
> > software
> > > >>> + * distributed under the License is distributed on an "AS IS"
> BASIS,
> > > >>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > > >>> implied.
> > > >>> + * See the License for the specific language governing permissions
> > and
> > > >>> + * limitations under the License.
> > > >>> + */
> > > >>> +package org.apache.commons.lang3.reflect;
> > > >>> +
> > > >>> +import static org.junit.Assert.assertEquals;
> > > >>> +import static org.junit.Assert.assertNotEquals;
> > > >>> +import static org.junit.Assert.assertTrue;
> > > >>> +
> > > >>> +import java.util.List;
> > > >>> +
> > > >>> +import org.junit.Test;
> > > >>> +
> > > >>> +public class TypeLiteralTest {
> > > >>> +
> > > >>> +    @Test
> > > >>> +    public void testBasic() {
> > > >>> +        assertTrue(TypeUtils.equals(String.class, new
> > > >>> TypeLiteral<String>() {}.value));
> > > >>> +
> >  assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class,
> > > >>> String.class),
> > > >>> +            new TypeLiteral<List<String>>() {}.value));
> > > >>> +    }
> > > >>> +
> > > >>> +    @Test
> > > >>> +    public void testTyped() {
> > > >>> +        final Typed<String> stringType = new TypeLiteral<String>()
> > {};
> > > >>> +        assertTrue(TypeUtils.equals(String.class,
> > > >> stringType.getType()));
> > > >>> +        final Typed<List<String>> listOfStringType = new
> > > >>> TypeLiteral<List<String>>() {};
> > > >>> +
> >  assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class,
> > > >>> String.class), listOfStringType.getType()));
> > > >>> +    }
> > > >>> +
> > > >>> +    @Test
> > > >>> +    public void testEquals() {
> > > >>> +        assertEquals(new TypeLiteral<String>() {}, new
> > > >>> TypeLiteral<String>() {});
> > > >>> +        assertEquals(new TypeLiteral<List<String>>() {}, new
> > > >>> TypeLiteral<List<String>>() {});
> > > >>> +        assertNotEquals(new TypeLiteral<String>() {}, new
> > > >>> TypeLiteral<List<String>>() {});
> > > >>> +    }
> > > >>> +
> > > >>> +    @SuppressWarnings("rawtypes")
> > > >>> +    @Test(expected = NullPointerException.class)
> > > >>> +    public void testRaw() {
> > > >>> +        new TypeLiteral() {};
> > > >>> +    }
> > > >>> +}
> > > >>>
> > > >>>
> > > >>>
> > > >>
> > > >>
> > > >> --
> > > >> E-Mail: [email protected] | [email protected]
> > > >> Java Persistence with Hibernate, Second Edition<
> > > >> http://www.manning.com/bauer3/>
> > > >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> > > >> Spring Batch in Action <http://www.manning.com/templier/>
> > > >> Blog: http://garygregory.wordpress.com
> > > >> Home: http://garygregory.com/
> > > >> Tweet! http://twitter.com/GaryGregory
> > > >>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [email protected]
> > > For additional commands, e-mail: [email protected]
> > >
> >
>
>
>
> --
> http://people.apache.org/~britter/
> http://www.systemoutprintln.de/
> http://twitter.com/BenediktRitter
> http://github.com/britter
>

Reply via email to