Tag: generics

Java Generics – 这两个方法声明是等效的吗?

给定一些SomeBaseClass类,这两个方法声明是否等效? public void myMethod(Class clz) 和 public void myMethod(Class clz)

如何在Java中使用generics来转换列表?

请考虑以下代码段: public interface MyInterface { public int getId(); } public class MyPojo implements MyInterface { private int id; public MyPojo(int id) { this.id = id; } public int getId() { return id; } } public ArrayList getMyInterfaces() { ArrayList myPojos = new ArrayList(0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return (ArrayList) myPojos; } return语句执行不编译的转换。 如何将myPojos列表转换为更通用的列表, 而无需遍历列表中的每个项目 ? […]

Spring 3.2 Autowiregenerics类型

所以我在Spring 3.2中有许多generics,理想情况下我的架构看起来像这样。 class GenericDao{} class GenericService<T, T_DAO extends GenericDao> { // FAILS @Autowired T_DAO; } @Component class Foo{} @Repository class FooDao extends GenericDao{} @Service FooService extends GenericService{} 遗憾的是,对于generics的多个实现,自动assembly会引发有关多个匹配bean定义的错误。 我认为这是因为@Autowired进程在类型擦除之前。 我找到或想出的每一个解决方案看起来都很难看,或者只是莫名其妙地拒绝工作。 解决这个问题的最佳方法是什么?

Java Generics:将通用函数对象链接在一起

我一直在努力解决以下问题。 我有一系列函数对象,每个函数对象都有自己的输入和输出类型,通过java中的generics类型参数定义。 我想在链中安排这些,以便将原始数据输入到第一个函数,转换为输出类型,这是下一个对象的输入类型,依此类推。 当然这对于硬编码来说是微不足道的,但是我想让代码可以插入到新的函数对象中。 如果我只是省略类型参数(只有最终输出类型),这就是事情的样子: public T process() { Iterator it = source.provideData(); for(Pipe pipe : pipeline) { it = pipe.processIterator(it); } return sink.next(it); } 这里,数据上的迭代器在函数对象之间传递,上下文应该是Context。 有没有办法保持以下类型的管道可插拔,仍然保持类型安全? 编辑:为清楚起见,我有一系列function对象,管道。 每个都将特定类型作为输入,并输出另一种类型。 (实际上是这些类型的迭代器)这些将被链接在一起,例如, Pipe -> Pipe -> Pipe -> … ,以便输出一个pipe是下一个管道的输入类型。 这里还有一个源,它输出一个类型为A的迭代器,以及一个接受类型的接收器(过去管道的输出)。 这会让事情更清楚吗? 问题是,因为输入和输出类型的兼容性存在严重依赖性,有没有办法确保这一点? 我开始认为将函数对象插入管道可能是确保类型安全的最佳时间,但我不知道如何做到这一点。 编辑2:我有一个函数对象的加法器方法,目前如下所示: public void addPipe(Pipe pipe) { pipeline.add(pipe); } 我想检查第一个类型参数是否与当前管道的“结束”相同,如果不是则抛出exception? 我不认为有一个很好的方法来获得编译时安全性。 然后可以将当前管道的“结束”设置为输入管道的第二个类型参数。 我想不出如何用generics来做这件事,并且传递类信息似乎很可怕。

如何使用“instanceof”实现generics的“equals”方法?

我有一个接受generics类型的类 ,我想以一种非笨拙的方式覆盖equals方法(即看起来很干净并且代码量很少的东西,但对于非常一般的用例)。 现在我有这样的事情: public class SingularNode { private T value; @SuppressWarnings(“unchecked”) @Override public boolean equals(Object other){ if(other instanceof SingularNode){ if(((SingularNode)other).value.equals(value)){ return true; } } return false; } } 我猜,这是非常有缺陷的 – 我正在对other对象的SingularNode进行强制转换,这可能会引发错误 。 另一件事是 – 当我这样做if(other instanceof SingularNode)我实际上并没有检查到正确的东西。 我实际上想检查类型T而不是类型? 。 每当我试图制作? 进入T ,我得到一些错误: 无法对参数化类型SingularNode执行instanceof检查。 请改为使用SingularNodeforms,因为在运行时将删除其他generics类型信息 我怎么能绕过这个? 有没有办法做T.class.isInstance(other); ? 我想有一个非常难看的黑客解决方案是这样的: @SuppressWarnings(“unchecked”) public boolean isEqualTo(Class c, Object obj){ […]

Javagenerics:如何用Java编码Functor接口?

我想用Java定义一个Functor类。 这有效: //a Function public interface F { public R apply(A a); } public interface Functor { public Functor fmap(F f); } 但是fmap的返回值应该不是Functor ,而是相应的子类。 通常这可以使用CRTP进行编码,但是由于附加参数A ,我在这里似乎遇到了障碍 。 例如,以下和类似的编码不起作用(“类型参数FInst不在其范围内”): public interface Functor<A, FInst extends Functor> { public <B, I extends Functor> I fmap(F f); } [澄清] 对于“适当的子类”,我指的是被称为自身的类的类型。 例如列表是仿函数,所以我想写类似的东西 public class ListFunctor implements ??? { final private […]

参数化类型是什么意思?

此链接指出以下内容: 具有实际类型参数的generics类型的实例化称为参数化类型。 示例(参数化类型): Collection coll = new LinkedList(); 那么什么是参数化类型? Collection或 LinkedList

Java Generics无法正常工作

为什么generics不能在我的机器上工作。 为什么下面的代码不能在没有类型转换为String Eclipse中工作。 我使用的是Java 1.6 package com.withgeneric; class Util { // Generic static method public static boolean compare(Pair p1, Pair p2) { return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()); } } class SPair { private K key; private V value; // Generic constructor public SPair(K key, V value) { this.key = key; this.value = value; } // Generic […]

Java Generics Hell

我怀疑此处已被问过(并已回答),但我不知道如何命名问题。 为什么只有在我没有通过课程本身时才能表达通配符而没有问题? 这一切都归结为这段代码。 除了调用genericsHell(ShapeSaver.class)之外,一切都按预期工作: interface Shape { } interface Circle extends Shape { } interface ShapeProcessor { } class CircleDrawer implements ShapeProcessor { } class ShapeSaver implements ShapeProcessor { } class Test { void genericsHeaven(ShapeProcessor a) {} void genericsHell(Class<? extends ShapeProcessor> a) {} void test() { genericsHeaven(new CircleDrawer()); genericsHeaven(new ShapeSaver()); genericsHell(CircleDrawer.class); genericsHell(ShapeSaver.class); // ERROR: The […]

区别? (通配符)和Java中的Type参数

有人可以解释一下这两种方法之间的区别吗? 它们一样吗? 就他们解决的问题而言,他们看起来和我一样。 如果它们相同,为什么需要? ? 方法#1,无界限 public static void printList(List list) { for (Object elem : list) System.out.println(elem + ” “); System.out.println(); } 方法#2,无界: public static void printList(List list) { for (Object elem : list) System.out.println(elem + ” “); System.out.println(); } 方法#1,有界 public static void printList(List list) { for (Object elem : list) System.out.println(elem + […]