缺少C#通用通配符<;的解决方法是什么&燃气轮机;
在Java中,我可以声明如下方法:缺少C#通用通配符<;的解决方法是什么&燃气轮机;,c#,.net,generics,wildcard,C#,.net,Generics,Wildcard,在Java中,我可以声明如下方法:public boolean doSth(Cache-Cache,CacheItem-item){…} public interface Cache<T> { public boolean Contains(T item); } public class CacheFilePath implements Cache<FilePathItem> { @Override public boolean Contains
public boolean doSth(Cache-Cache,CacheItem-item){…}
public interface Cache<T> {
public boolean Contains(T item);
}
public class CacheFilePath implements Cache<FilePathItem> {
@Override
public boolean Contains(FilePathItem item) {
return false; // TODO
}
}
public class ItemHandler {
public boolean doSth(Cache<?> cache, CacheItem item){
if(cache instanceof CacheHostName && item instanceof HostNameItem){
CacheHostName c = (CacheHostName) cache;
HostNameItem i = (HostNameItem) item;
return check(c, i);
}
else if(cache instanceof CacheFilePath && item instanceof FilePathItem){
CacheFilePath c = (CacheFilePath) cache;
FilePathItem i = (FilePathItem) item;
return check(c, i);
}
throw new RuntimeException("Invalid arguments !!!");
}
private boolean check(Cache<HostNameItem> cache, HostNameItem item){
return cache.Contains(item);
}
private boolean check(Cache<FilePathItem> cache, FilePathItem item){
return cache.Contains(item);
}
}
公共接口缓存{
公共布尔包含(T项);
}
公共类CacheFilePath实现缓存{
@凌驾
公共布尔包含(FilePathItem项){
返回false;//TODO
}
}
公共类ItemHandler{
公共布尔doSth(缓存、缓存项){
if(缓存主机名的缓存实例和主机名项目的项目实例){
CacheHostName c=(CacheHostName)缓存;
HostNameItem i=(HostNameItem)项;
退票(c,i);
}
else if(CacheFilePath的缓存实例&filepath项目的项目实例){
CacheFilePath c=(CacheFilePath)缓存;
FilePathItem i=(FilePathItem)项;
退票(c,i);
}
抛出新的RuntimeException(“无效参数!!!”);
}
私有布尔检查(缓存、主机名项){
返回cache.Contains(项);
}
私有布尔检查(缓存、FilePathItem){
返回cache.Contains(项);
}
}
如何在C#中声明这样一个方法?您可以在该方法上声明一个类型参数,如下所示:
public boolean doSth<T>(Cache<T> cache, CacheItem item){
...
}
publicbooleandosth(缓存、缓存项){
...
}
或使用非泛型基类或接口:
public interface ICache { ... }
public class Cache<T> : ICache { ... }
public boolean doSth(ICache cache, CacheItem item){
...
}
公共接口ICache{…}
公共类缓存:ICache{…}
公共布尔DOTH(ICache缓存,CacheItem){
...
}
为什么使方法泛化并不能解决您的问题?顺便说一句,让一个方法泛型,然后在一堆派生类型之间切换,然后对它们进行操作,这通常是代码的味道。通常情况下,您应该只使用N个重载,而不是一堆类型检查和强制转换。通过泛型类实现使用对象
的接口,以及使用特定类型的相同方法,通常可以避免此问题。如果Cache
不执行此操作,并且它不是您可以修改的,则最接近上述代码的方法是接受object
,并手动键入check,以检查typeof(Cache)
。