Tag: generics

在具有generics的子类型的inheritance接口中覆盖方法

我在java中有以下层次结构: interface ObserverA {} interface A { void method1(); addObserver(Observer o); } 我想像这样扩展它: interface ObserverB extends ObserverA{} interface B extends A { void method2(); addObserver(ObserverB o); } 以这种方式, B的addObserver()方法将覆盖A的相同方法。 因为它不起作用, B实现需要实现addObserver()两个版本,我不会只有一个版本。 这可以通过巧妙的方式完成,不需要参数化A如: interface A { addObserver(O o); } Hackish解决方案非常受欢迎!

重构Java数组和原语(double )到集合和generics(List <List >)

我一直在重构一次性代码,这是我几年前以类似FORTRAN的方式编写的。 大多数代码现在更加有条理和可读。 然而,算法的核心(性能关键)使用1维和2维Java数组,其典型代表是: for (int j = 1; j < len[1]+1; j++) { int jj = (cont == BY_TYPE) ? seq[1][j-1] : j-1; for (int i = 1; i matrix[i][j]) { matrix[i][j] = m; pointers[i][j] = UP; } //… } } 为清楚起见,可维护性以及与其余代码的接口,我想重构它。 但是,在阅读用于数组和Javagenerics的 Java Generics语法 和数字时,我有以下问题: 性能。 该代码计划使用大约10 ^ 8 – 10 ^ 9秒/年,这几乎是可管理的。 我的阅读表明,将double改为Double有时可以在性能上增加3倍。 […]

如何在此代码中inheritance父类的内部类?

下面是父类DblyLinkList package JavaCollections.list; import java.util.Iterator; import java.util.NoSuchElementException; public class DblyLinkList implements Iterable{ class DListNode { private T item; private DListNode prev; private DListNode next; DListNode(T item, DListNode p, DListNode n) { this.item = item; this.prev = p; this.next = n; } } ….. } 下面是派生类LockableList , package JavaCollections.list; import JavaCollections.list.DblyLinkList.DListNode; public class LockableList extends DblyLinkList […]

Javagenerics放在Map <String,? 扩展List >

有没有办法以类型安全的方式进行以下实现? public void myMethod( Map<String, ? extends List> map ) { map.put(“foo”, Collections.singletonList(“bar”); } 上述实现不起作用。 它需要Map<String, ? super List> Map<String, ? super List>正确编译方法map.put() 。 但是myMethod不会以这种方式接受List的任何子类型。 所以,我必须使用Map<String, ? extends List> Map<String, ? extends List> 。 如何以类型安全的方式解决此问题?

generics和(超级?)类型令牌可以帮助构建类型安全的新闻聚合器吗?

我有这个基本的News界面 interface News { String getHeader(); String getText(); } 和SportsNews和FinancialNews等具体方法一样,提供getStockPrice() , getSport()等特定方法。 新闻打算发送到 interface Subscriber { void onNews(N news); } 问题是如何注册和维护订阅。 我尝试的第一种方法是使用中央Aggregator ,在Class对象和Set<Subscriber>之间保持映射,但很快这种方法显示不可行。 这是所需的API public class Aggregator { public void subscribe(Subscriber subscriber) { // TODO somehow (super type token) extract N and // add the item to the set retrieved by getSubscribersFor() } public void […]

Javagenerics从类创建数组

我有一个层次结构,其中Square,Triangle和Circle都从Shape扩展。 我有一个工作方法: public void someMethod() { File file = new File(“File_with_squares”); ThirdPartyClass foo = new ThirdPartyClass(); Square[] squares = foo.someMajicMethod(Square[].class,file); for (Square square: squares) square.draw(); } 现在我想使这个方法通用,以便它可以接受任何形状。 我希望能够将其称为someMethod(Triangle.class,new File(“File_with_triangles”)或someMethod(Circle.class, new File(“File_with_circles”) 。我正在尝试这样: public void someMethod(Class type, File shapeFile) { ThirdPartyClass foo = new ThirdPartyClass(); #### What goes here??? #### for (Shape shape: shapes) shape.draw(); } […]

比较generics类型Java

我在比较generics类型时遇到问题。 在C#i中,我总是做类似的事情: class Element where T : IComparable 。 我的问题是它如何用java编写?

Javagenerics:通配符

因此,我正在阅读generics,以便重新熟悉这些概念,特别是在涉及通配符的地方,因为我几乎没有使用它们或碰到它们。 从我所做的阅读中我无法理解为什么他们使用通配符。 我不断遇到的一个例子如下。 void printCollection( Collection c ) { for (Object o : c){ System.out.println(o); } } 你为什么不写这个: void printCollection( Collection c ) { for(T o : c) { System.out.println(o); } } 来自oracle网站的另一个例子: public static double sumOfList(List list) { double s = 0.0; for (Number n : list) s += n.doubleValue(); return s; } 为什么这不是写的 […]

可能是两个类之间的递归Javagenerics

我正在尝试生成一些类来控制模型 – 视图 – 展示器应用程序。 我已经提出了以下定义,但我正在努力避免递归generics。 public abstract class Presenter<V extends View> { protected V view; public Presenter(V view) { this.view = view; } // … } public abstract class View<P extends Presenter> { protected P presenter; // … } 我想强制实现两个类之间的相互关系。 我的想法是,我可以为特定的View实例化一个Presenter,这两个类依赖于抽象基类中定义的有用方法,但两者都确切地知道对应的抽象类的子类正在使用中。 我的问题是定义..? 部分代码。 我无法看到避免递归情况的方法,例如: public abstract class View<P extends Presenter, V extends View, Q […]

为什么不为generics自动封装Java原始类型?

Java不允许在通用数据结构中使用原始类型。 例如,不允许使用ArrayList 。 原因是,原始类型不能直接转换为Object。 但是Java 1.5确实支持自动装箱,而包装类在通用数据结构中工作。 那么为什么编译器无法将其自动封装到ArrayList ? 为什么这不起作用还有其他原因吗?