我有一个遗留类,该类本身不是通用的,但其方法之一返回类型使用泛型:
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.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) 我正在尝试使用自定义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) 我知道它是许多编程语言中的一种常见模式(主要是功能性的),但我不确切地知道它是如何调用的.所以我有一个数据结构,例如列表A和其他列表B.列表A包含一些值(中文字符串),我想将这些字符串映射到列表B,将它们翻译成英语.所谓的地图和变异.有人可以告诉我这个模式是如何正确命名的,并在objective-C,Java,Haskell等中给出一些指向它的实现的链接.
我有一个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循环?
我对此的研究只引发了我的主题,解释了为什么我需要每个人,我认为这在这种情况下是相关的.