Implementing a generic parameterized Java interface so that it satisfies (instance? ParameterizedType)

472 views
Skip to first unread message

Jakub Holý

unread,
Aug 4, 2016, 5:30:04 PM8/4/16
to Clojure
I need to implement the interface javax.websocket.MessageHandler.Whole<String> - the type parameter is important since the Java code uses reflection to check whether the result is instanceof java.lang.reflect.ParameterizedType.

I believe I cannot use proxy or any other available Clojure mechanism as they do not support generics. Is that correct?

I believe that the only (and best) solution is to implement the interface in Java and then possibly extend the resulting class:

public class TextMessageHandler implements javax.websocket.MessageHandler.Whole<String> {
    public void onMessage(String message) {
    }
}
----
(proxy [TextMessageHandler] []
    (onMessage [msg]
      (println "received message(" (.getClass msg) "):" msg)))

Correct?

Thank you!

Cheers, Jakub Holý

Colin Fleming

unread,
Aug 4, 2016, 6:56:09 PM8/4/16
to clo...@googlegroups.com
Hi Jakub,

Yes, that is correct - Clojure interop only deals with raw classes, it has no concept of generics. Java is the way to go here.

Cheers,
Colin

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Timothy Baldridge

unread,
Aug 4, 2016, 7:18:11 PM8/4/16
to clo...@googlegroups.com
I'd dig into it a bit more, since the JVM doesn't support generics either. So if there's an api looking for some marker interfaces, it might be possible to implement those interfaces as well. There's probably a way to do this in pure Clojure.

On Thu, Aug 4, 2016 at 4:55 PM, Colin Fleming <colin.ma...@gmail.com> wrote:
Hi Jakub,

Yes, that is correct - Clojure interop only deals with raw classes, it has no concept of generics. Java is the way to go here.

Cheers,
Colin
On 5 August 2016 at 09:28, Jakub Holý <jakubh...@gmail.com> wrote:
I need to implement the interface javax.websocket.MessageHandler.Whole<String> - the type parameter is important since the Java code uses reflection to check whether the result is instanceof java.lang.reflect.ParameterizedType.

I believe I cannot use proxy or any other available Clojure mechanism as they do not support generics. Is that correct?

I believe that the only (and best) solution is to implement the interface in Java and then possibly extend the resulting class:

public class TextMessageHandler implements javax.websocket.MessageHandler.Whole<String> {
    public void onMessage(String message) {
    }
}
----
(proxy [TextMessageHandler] []
    (onMessage [msg]
      (println "received message(" (.getClass msg) "):" msg)))

Correct?

Thank you!

Cheers, Jakub Holý

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
“One of the main causes of the fall of the Roman Empire was that–lacking zero–they had no way to indicate successful termination of their C programs.”
(Robert Firth)

Colin Fleming

unread,
Aug 4, 2016, 9:30:22 PM8/4/16
to clo...@googlegroups.com
The JVM does retain some generic information (see for example Neil Gafter's Super Type Tokens), in particular Type instances can retain generic info which is what the linked code is using. It might be possible to recreate this in pure Clojure but IMO it's likely to be more difficult than it's worth - all the reflective Type code is very fiddly. YMMV, of course.


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
--
“One of the main causes of the fall of the Roman Empire was that–lacking zero–they had no way to indicate successful termination of their C programs.”
(Robert Firth)

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

Jakub Holý

unread,
Aug 5, 2016, 4:08:36 AM8/5/16
to Clojure
Thanks a lot, Colin! It is good to get my beliefs confirmed :-)

(And you too, tbc++, for contributing!)

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
--
“One of the main causes of the fall of the Roman Empire was that–lacking zero–they had no way to indicate successful termination of their C programs.”
(Robert Firth)

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages