Tag: generics

涉及inheritance和此的Javagenerics

我有一个(对我来说)复杂的Javagenerics问题。 我阅读了一些文档,并了解了一些,但肯定不是我应该做的全部。 基本上,对我来说,试图解决它会导致尝试和错误。 在下文中,我给出了一个我的代码的简要示例,一次没有任何generics(因此可以希望了解我想要实现的内容),另一个附加一些更接近解决方案的附加内容。 请更正我的第二个版本和/或指向我的具体文档。 (我有Javagenerics的一般文档。但我的代码似乎有几个干扰的挑战,很难找到正确的解决方案) 关于我的例子:有一个抽象基类型和几个实现变量(只给出一个)。 方法combine()调用getOp1() ,它决定(取决于 )它是应该在自己的实例上运行还是在新实例上运行。 计算完成后,返回目标实例。 abstract class Base { protected final Base getOp1() { if(Util.isConditionMet()) { return getNewInstance(); } else { return this; } } protected abstract Base getNewInstance(); // returns a new instance of an implementing class public abstract Base combine(Base other); } class Variant extends Base { […]

覆盖Java中的generics集合时出错

当我尝试覆盖一个采用List ,我得到以下编译错误 。 此行有多个标记: – 子类型的方法getname(List)必须覆盖或实现超类型方法 – 名称冲突:类型为child的方法getname(List)与parent类型的getname(List)具有相同的擦除,但不会覆盖它 我的印象是,由于擦除 ,采用List的方法和采用List的子类方法将被视为被覆盖 ,因为擦除后两种方法的签名都相同。 以下是涉及擦除的 方法签名的定义。 我不明白为什么会出现这个错误,究竟是什么意思。 我的代码如下: class parent { public void getname(List num) { System.out.printf(“parent class: %s”,num); } } class child extends parent { @Override // here is the compile error public void getname(List num) { System.out.printf(“child class: %s”,num); } }

generics不允许将A的超类型添加到列表中

我在列表中使用通配符和下界generics,但编译器抛出错误。 码: int intStart = 0; Number num = new Integer(2); List listOfNumbers = new ArrayList(); listOfNumbers.add(intStart); listOfNumbers.add(num); //throws compiler error 错误: 类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number) 用List List ,我应该被允许添加Integer类型的任何对象或其超类型,例如Number或Object。 我经历了一些SO讨论,但无法找到为什么我应该犯错误。

为什么我会得到一个类强制转换exception(使用generics,可比较)?

我正在尝试实现一个排序和未排序的数组列表。 两者都扩展了一个名为AbstractArrayMyList的类,它包含常见的操作/实现 – toString,clear等…. 这是我的AbstractArrayMyList代码(它实现了我定义的通用接口) public abstract class AbstractArrayMyList implements MyList { protected E[] elementData; ….. } 我选择对elementData进行保护,以便排序和未排序的专用数组列表可以访问它并对其执行操作。 这是我的排序数组列表的声明/代码 public class ArrayListSorted<E extends Comparable> extends AbstractArrayMyList 这一切都很好。 但是当我用这些行测试我的代码时 ArrayListSorted toTestInteger = new ArrayListSorted() toTestInteger.insert(0); assertEquals(toTestInteger.get(0).intValue(), 0); 我得到一个类强制转换exception java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; at myarraylist.ArrayListSorted.getIndex(ArrayListSorted.java:38) 发生在这里 @Override public int getIndex(E value) { int lo […]

Java通用接口与类型安全实现

我正在寻找从通用框架调用特定接口的好方法。 我将用代码举例说明。 查看问题部分 ,示例代码主要包含在内,以便彻底,并将示例放入真实场景中。 例 假设我们想要基于组件列表构建报告。 假设我们有两种特定的组件类型: public interface Component { … } public class PDFComponents extends Component { … } public class WordComponents extends Component { … } 每个组件都有一个ReportBuilder实现,例如, public interface ReportBuilder { … } public class PDFReportBuilder extends ReportBuilder { … } public class WordReportBuilder extends ReportBuilder { … } 其中构建特定的报告实现 public interface […]

查找ArrayList 中保存的特定类型(即Object = String等)

假设我有一个ArrayList,我已经转换为对象的ArrayList。 我知道我投射的ArrayList中的所有对象都是相同的类型,但不是类型。 现在,如果ArrayList不为空,我可以使用其中的一个对象并使用instanceof运算符来了解实际类型。 但是ArrayList为空的情况呢? 我如何确定Object的实际类型呢? 可能吗? 编辑:回想起来,我认为空ArrayList的类型并不严格。 我可以丢弃旧的并且构造一个我正在寻找的正确类型的新空ArrayList。 它有点乱,所以如果有人有关于如何允许各种可能不共享相关公共超类(例如Integer和ArrayList)的潜在类型的替代建议,我愿意接受建议。 问题是,我有一个类,它将包含专门设计用于在其中互换的其他类。 包含的类可以对类型进行假设,因为它们是定义它的类型。 周围的类不能做出这样的假设,但必须确认它指定的类型与已插入其中的包含类相同。 因此我的问题是,包含类是通用的(generics指定它处理的类型),但它必须确保它传递的包含的类返回并操作指定给它的类型(它们被设计为可以单独创建,因此它们匹配的事实必须在插入时确认,而不是在创建它们时确认。

无法从Guava解析通用参数TypeToken

我正在开发一个用于为Selenium测试框架构建通用菜单的框架,我一直在使用Guava TypeToken来解析通用参数的类型,但现在我遇到了类型令牌无法解析参数的问题: 我有一个生成菜单选项的构建器的abstract基class : public abstract class AbstractMenuOptionBuilder { protected final TypeToken<AbstractMenuOptionBuilder> typeToken = new TypeToken<AbstractMenuOptionBuilder>(getClass()) { }; public abstract O create(); } 这是构建器的具体class : public class MenuOptionBuilder extends AbstractMenuOptionBuilder { public O create() { TypeToken genericOptionParam = typeToken.resolveType(AbstractMenuOptionBuilder.class.getTypeParameters()[0]); Class optionClass; try { optionClass = (Class) Class.forName(genericOptionParam.getType().getTypeName()); } catch(ClassNotFoundException e) { log.catching(e); return null; } […]

使用带有DAO模式的Guice进行dependency injection

对于我正在研究的小型项目,我一直在努力为我与DB的交互实现一些DAO模式,并且已经开始使用Guice(我第一次)为我处理DI。 现在我有这个类层次结构: DAOImpl引用类类型,因此我的数据库客户端(mongo / morphia)可以执行一些初始化工作并实例化BasicDAO提供的BasicDAO。 以下是相关课程的片段: public class DAOImpl implements DAO { private static final Logger LOG = LoggerFactory.getLogger(DAOImpl.class); private static final String ID_KEY = “id”; private final org.mongodb.morphia.dao.DAO morphiaDAO; @Inject public DAOImpl(Datastore ds, Class resourceClass) { morphiaDAO = new BasicDAO(resourceClass, ds); LOG.info(“ensuring mongodb indexes for {}”, resourceClass); morphiaDAO.getDatastore().ensureIndexes(resourceClass); } } public class UserDAO extends […]

为什么Collections.binarySearch()使用这个可比较的?

我有这个实现Comparable接口的Player类。 然后我有一个Player的ArrayList 。 我正在尝试在Player的列表中使用binarySearch()来查找一个Player ,但是Java给了我一个“ cannot find symbol: method binarySearch(java.util.ArrayList,Player) ”。 这个Player类: class Player implements Comparable { private String username; private String password; Statistics stats; //Constructor, creates a new Player with a supplied username Player(String name) { username = name; password = “”; stats = new Statistics(); } //Accessor method to return the username as […]

Java:不能通用List mylist

另一个例子非常复杂,我根本不理解它,我的问题在某种程度上是类似的,但正如我所说的那样更简单,可能会在更简单的答案中产生 public List myfunction(List mylist){ mylist.add(new Child()) ; //Doesn’t Compile }