Tag: generics

Javagenerics:获取generics方法的返回类型

背景 我曾经写过这个方法: private SortedSet createSortedSet() { return new TreeSet(); } 它应该像这样调用: Set set = createSortedSet(); 这工作正常(虽然我在研究当前问题时看到了答案,这是容易出错的)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): private T evaluate(String expression) { ExpressionEvaluator evaluator = pageContext.getExpressionEvaluator(); return evaluator.evaluate(expression, T, null, pageContext.getVariableResolver()); } 目的是能够这样称呼: Integer width = evaluate(widthStr); 我的evaluate方法中的代码显然不起作用。 evaluator.evaluate()的第二个参数应该是一个Class对象。 这导致我: 我的问题 如何获得generics(返回)类型的类? 作为评估的第二个参数,我应该用什么来代替T? 编辑:结论 Nicolas似乎是对的,它无法完成,我需要将类作为参数传递给我的方法。 好处是,由于他的解决方案使参数在generics类型上进行参数化,因此我会对该参数进行编译检查。

编译器的行为方式与generics方法的null参数不同

以下代码与Eclipse完美编译,但无法使用javac进行编译: public class HowBizarre { public static void doIt(P value) { } public static void main(String[] args) { doIt(null); } } 我简化了代码,所以现在根本不使用T. 不过,我没有看到错误的原因。 出于某种原因,javac决定T代表Object,然后抱怨Object不符合T的界限(这是真的): HowBizarre.java:6:不兼容的类型; 推断类型参数java.lang.Number,java.lang.Object不符合类型变量的范围P(T) 发现: 无效 要求:无效 doIt(null); ^ 请注意,如果我将null参数替换为非null值,则编译正常。 哪个编译器行为正确,为什么? 这是其中之一的错误吗?

你能把一个int数组传递给java中的generics方法吗?

我正在玩一些代码katas并试图在同一时间更好地理解javagenerics。 我有这个小方法打印数组,就像我喜欢看到它们一样,我有几个辅助方法接受一个’事物’数组和一个索引,并返回索引上方或下方的“事物”数组(这是一个二进制搜索算法)。 两个问题, #1我可以避免在splitBottom和splitTop中转换为T吗? 它感觉不对,或者我以错误的方式进行此操作(不要告诉我使用python或其他东西..;)) #2我是否必须编写单独的方法来处理原始数组,还是有更好的解决方案? public class Util { public static void print(T[] array) { System.out.print(“{“); for (int i = 0; i < array.length; i++) { System.out.print(array[i]); if (i < array.length – 1) { System.out.print(", "); } } System.out.println("}"); } public static T[] splitTop(T[] array, int index) { Object[] result = new Object[array.length – […]

创建循环通用引用

我正在编写一个应用程序来在对等网络中进行一些分布式计算。 在定义网络时,我有两类P2PNetwork和P2PClient。 我希望这些是通用的,因此有以下定义: P2PNetwork<T extends P2PClient<? extends P2PNetwork>> P2PClient<T extends P2PNetwork> 用P2PClient定义setNetwork(T网络)的方法。 我希望用这段代码描述的是: P2P网络由特定类型的客户端构成 P2PClient可能只属于其客户端由与此客户端相同类型的网络(循环引用) 这似乎对我来说是正确的,但如果我尝试创建一个非generics版本,如 MyP2PClient<MyP2PNetwork> myClient; 和其他变种我从编译器收到很多错误。 所以我的问题如下: 是否可以使用通用循环引用(我从未见过明确禁止它的任何内容)? 上述通用定义是否是这种循环关系的正确定义? 如果它是有效的,它是描述这种关系的“正确”方式(即是否有另一个有效的定义,这在风格上是首选的)? 在给定正确的通用定义的情况下,如何正确定义客户端和服务器的非generics实例?

generics,类型参数和通配符

我试图理解javagenerics,它们似乎很难理解。 例如,这很好…… public class Main { public static void main(String[] args) { List list = null; method(list); } public static void method(List list) { } } ……就这样…… public class Main { public static void main(String[] args) { List<List> list = null; method(list); } public static void method(List list) { } } … 和这个 … public […]

Consumer 在HashMap中映射了Class

我想创建一个IdentityHashMap<Class, Consumer> 。 基本上,我想用一种方法来映射一个类型,说明如何处理这种类型。 我想动态地能够用对象X说出来,执行Y.我能做到 private IdentityHashMap<Class, Consumer> interceptor = new IdentityHashMap(); 但它很糟糕,因为那时我必须在使用它时将对象投射到lamba中。 例: interceptor.put(Train.class, train -> { System.out.println(((Train)train).getSpeed()); }); 我想做的是 private IdentityHashMap<Class, Consumer> interceptor = new IdentityHashMap(); 但似乎不允许这样做。 有没有办法做到这一点 ? 使用此类型的方法映射类型的最佳解决方法是什么?

仿制药的仿制药如何运作?

虽然我确实理解了generics的一些角落情况,但我遗漏了以下示例的内容。 我有以下课程 1 public class Test { 2 public static void main(String[] args) { 3 Test t = new Test(); 4 List<Test> l =Collections.singletonList(t); 5 } 6 } 第4行给出了错误 Type mismatch: cannot convert from List<Test> to List<Test>`. 显然,编译器认为不同? 并不是真的平等。 虽然我的直觉告诉我,这是正确的。 任何人都可以提供一个例子,如果第4行合法,我会得到运行时错误吗? 编辑: 为了避免混淆,我通过具体的赋值替换了第3行中的=null

Gson TypeToken如何运作?

据我所知,在Java中,例如,C#generics是编译时function,并通过类型擦除删除。 那么,Gson的TypeToken如何真正起作用? 它是如何获得对象的generics类型的?

Java Generics:为什么Map.get()忽略类型?

在Java中,Map接口定义为, public interface Map { … V get(Object key); … } 为什么不? V get(K key); 我只是碰到了一个讨厌的bug,因为使用了错误的类型键。 我认为generics的目的是在编译期间尽早捕获类型错误。 这会失败那个目的吗?

使用generics与GSON

我正在使用GSON将JSON解码为类型为T的对象,例如 public T decode(String json) { Gson gson = new Gson(); return gson.fromJson(json, new TypeToken() {}.getType()); } 然而,这会返回一个例外 – java.lang.AssertionError:意外类型。 期望的一个:java.lang.reflect.ParameterizedType,java.lang.reflect.GenericArrayType,但得到:sun.reflect.generics.reflectiveObjects.TypeVariableImpl,用于类型标记:T 我认为通过使用TypeToken我避免了类型擦除。 我错了吗? 谢谢