相关疑难解决方法(0)

对泛型类的非泛型引用会导致非泛型返回类型

我有一个遗留类,该类本身不是通用的,但其方法之一返回类型使用泛型:

public class Thing {
    public Collection<String> getStuff() { ... }
}
Run Code Online (Sandbox Code Playgroud)

getStuff()使用泛型返回字符串集合.因此我可以迭代,getStuff()不需要将元素转换为String:

Thing t = new Thing();
for (String s: t.getStuff())  // valid
{ ... }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将Thing自己更改为通用但保持其他所有内容相同:

public class Thing<T> {
    public Collection<String> getStuff() { ... }
}
Run Code Online (Sandbox Code Playgroud)

然后继续使用非泛型引用Thing,getStuff()不再返回Collection<String>而是返回非类型Collection.因此客户端代码不编译:

Thing t = new Thing();
for (String s: t.getStuff())  // compiler complains that Object can't be cast to String
{ ... }
Run Code Online (Sandbox Code Playgroud)

为什么是这样?解决方法有哪些?

我的猜测是,通过使用对泛型类的非泛型引用,Java会关闭整个类的所有泛型.这很痛苦,因为现在我通过使Thing成为通用来破坏我的客户端代码.

编辑: …

java generics

8
推荐指数
1
解决办法
4308
查看次数

错误:只能遍历数组或java.lang.Iterable的实例

请帮助我,我的错误似乎无法使其工作,因为它只能迭代数组或java.lang.Iterable的实例.我想创建一个条形码并阅读它并将其添加到word文档中

更新发布 nodeCollection来自com.aspose.words.

import com.aspose.barcode.*;
import com.aspose.barcoderecognition.BarCodeReadType;
import com.aspose.barcoderecognition.BarCodeReader;
import com.aspose.words.Document;
import com.aspose.words.DocumentBuilder;
import com.aspose.words.ImageType;
import com.aspose.words.NodeCollection;
import com.aspose.words.NodeType;
import com.aspose.words.Shape;

              try
        {
            // Generate barcode image
            BarCodeBuilder builder = new BarCodeBuilder();
            builder.setSymbologyType(Symbology.Code39Standard);
            builder.setCodeText("test-123");
            String strBarCodeImageSave = "img.jpg";
            builder.save(strBarCodeImageSave);

            // Add the image to a Word doc
            Document doc = new Document();
            DocumentBuilder docBuilder = new DocumentBuilder(doc);
            docBuilder.insertImage(strBarCodeImageSave);
            String strWordFile = "docout.doc";
            doc.save(strWordFile);

            // Recognition part
            // Extract image from the Word document
            NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false);
            int …
Run Code Online (Sandbox Code Playgroud)

java arrays for-loop

6
推荐指数
1
解决办法
5万
查看次数

泛型:为什么实现的集合返回一个对象而不是指定的类型?

我正在尝试使用自定义MapEntries实现OrderedMapEntry列表 - 因为我需要一个带有Vectors的自定义解决方案我不能使用TreeMap(http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap. HTML).我实现了一个没有任何错误的自定义列表,但是当我OrderedMapEntries在增强的for循环中使用该类时,它返回一个Object.

  • 使用增强型for循环时,如何确保类型安全?我的实施在确保这种类型安全方面做错了什么?

    public class OrderedMapEntries<K, V> implements Iterator, Iterable{
    
        private Vector<MapEntry<K, Vector<V>>> vector;
        private int vectorIndex;  // initializes with -1
    
        class MapEntry<A, B extends AbstractList<V>> implements Iterator, Iterable{
            // MapEntry implementation
    
        public void insert(int index, K key, Vector<V> vec){
            MapEntry<K, Vector<V>> mapEntry = new MapEntry<>(key, vec);
            vector.add(index, mapEntry);
        }
    
        @Override
        public MapEntry<K, Vector<V>> next(){
            vectorIndex++;
            return vector[vectorIndex]; 
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我尝试使用增强的for循环迭代集合,但它失败,因为next()返回一个Object而不是我指定的元素.

OrderedMapEntries<Integer, String> ome = new OrderedMapEntries<>();
// I filled it with …
Run Code Online (Sandbox Code Playgroud)

java generics

4
推荐指数
1
解决办法
122
查看次数

将数据从一个数据结构映射到另一个

我知道它是许多编程语言中的一种常见模式(主要是功能性的),但我不确切地知道它是如何调用的.所以我有一个数据结构,例如列表A和其他列表B.列表A包含一些值(中文字符串),我想将这些字符串映射到列表B,将它们翻译成英语.所谓的地图和变异.有人可以告诉我这个模式是如何正确命名的,并在objective-C,Java,Haskell等中给出一些指向它的实现的链接.

java haskell design-patterns functional-programming map

2
推荐指数
1
解决办法
315
查看次数

如何在我自己的集合中使用For-Each循环?

我有一个Network类,在它NET= ArrayList<Node>.我正在使用Network类来控制可以添加和不添加的内容,维护已ArrayList排序的等等,我有一个get方法,它将一个Node编号作为参数,使用二进制搜索ArrayList(它们根据该编号排序)

但是在大多数情况下,当其他对象需要在一个节点上调用时,他们只需要通过节点而不管它们的数量,并且通常不完全知道这个数字.

Network我有

public Iterator<Node> iterator() {
        return NET.iterator();
}
Run Code Online (Sandbox Code Playgroud)

等等

Iterator<Node> i = net.iterator();
Node n;
while (i.hasNext()) {
    n = i.next();
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

但对于

for (Node n : net) {

}
Run Code Online (Sandbox Code Playgroud)

我得到"foreach不适用于表达类型".如果可能的话,我还需要添加到网络以使用for-each循环?

我对此的研究只引发了我的主题,解释了为什么我需要每个人,我认为这在这种情况下是相关的.

java collections foreach iterator

0
推荐指数
1
解决办法
2157
查看次数