标签: generic-method

使用反射查找泛型方法时发现不明确的匹配

我正在使用反射来查找 Newtonsoft 的泛型方法,JsonConvert.DeserializedObject<T>但我发现它返回了非泛型版本的不明确匹配JsonConvert.DeserializeObject,这是尝试获取泛型方法的代码:

return typeof(JsonConvert).GetMethod("DeserializeObject", new Type[] { typeof(string) }).MakeGenericMethod(genericType);
Run Code Online (Sandbox Code Playgroud)

我已经指定我想要将 astring作为其唯一参数的方法,但泛型和非泛型版本都有匹配的参数列表,并且我收到了不明确的匹配错误。

是否可以通过GetMethod这种方式获得通用版本?我知道我可以使用 Linq 并GetMethods()找到它,例如:

var method = typeof(JsonConvert).GetMethods().FirstOrDefault(
            x => x.Name.Equals("DeserializeObject", StringComparison.OrdinalIgnoreCase) &&
            x.IsGenericMethod && x.GetParameters().Length == 1 &&
            x.GetParameters()[0].ParameterType == typeof(string));
Run Code Online (Sandbox Code Playgroud)

但这有点麻烦,一定有更好的方法。

c# generics reflection generic-method

6
推荐指数
2
解决办法
3292
查看次数

如何避免静态通用工厂方法中的"类型不匹配"?

要么我使用谷歌太愚蠢,要么到目前为止没有其他人遇到过这个问题.

我正在尝试编译以下代码:

public interface MyClass {
  public class Util {
    private static MyClass _this;
    public static <T extends MyClass> T getInstance(Class<T> clazz) {
      if(_this == null) {
        try {
          _this = clazz.newInstance();
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
      return _this;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,在"返回_this;"行中 我收到错误"类型不匹配:无法从MyClass转换为T"为什么会这样?T扩展了MyClass,问题出在哪里?如果我将线路改为"return(T)_this;",我只是得到关于未经检查的演员的警告,但我不喜欢警告;-)有没有办法实现我想要的没有错误或警告?

java generics generic-method

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

链接到 .rd 文件中的 S4 方法?

我正在编写一个包含 S4 类的包,并且我已经为该类编写了as.POSIXct方法as.POSIXlt。我已经编写了文档,一切看起来都很好,除了我想引用as.POSIXct文档中的方法as.POSIXlt,反之亦然。我尝试过\S4method{coerce}{abc, POSIXct}(from, to)(其中“abc”是 S4 类),但这只应该放在该\usage部分中,这不是我想要的位置。有没有办法做到这一点?我觉得很奇怪,这是不允许的。

我意识到可以组合这些 .rd 文件并避免此问题,但我正在尝试尽可能多地了解 R 中的类和包,因此无论如何这对我很感兴趣。

以下是其中一个 .Rd 文件的框架:

\name{as.POSIXct-methods}
\docType{methods}
\alias{as.POSIXct-methods}
\alias{as.POSIXct,ANY-method}
\alias{as.POSIXct,abc-method}
\title{\code{abc} Method for Function \code{as.POSIXct}}
\description{
\code{as.POSIXct} method to coerce timestamps in \code{abc} objects into 
\code{POSIXct} format.
}
\section{Methods}{
\describe{
~~description here~~

\item{\code{signature(x = "ANY")}}{
default implementation (from base)
}

\item{\code{signature(x = "abc")}}{
implementation for \code{\link{abc}} objects. 
~~more description of function~~
See \code{\linkS4class{abc}} for more about abc objects. …
Run Code Online (Sandbox Code Playgroud)

r package generic-method r-s4

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

具有通用约束的通用方法

我想要做的是有一个方法,将泛型类型作为带有约束的参数.但是,约束的类型也有第二种泛型类型,但我希望该方法能够工作,无论第二次输入是什么:

public class IEvent<T> where T : EventArgs { }
public class EventManager
{
    public void DoMethod<T>() where T: IEvent<???>
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我试图让我的EventManager班级接受任何类型的活动,然后用它做点什么.我是在过度复杂化,还是可行的?

c# generics generic-method

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

使用do.call进行通用S4方法

我有一个参数列表,并希望通过do.call调用B(var3 = list(1:3)).但是下面的示例仅调用dispatch"missing"的方法.如何访问调度方法"ANY"?

B.initialize<-function(..., var3=list()){
  callSuper(..., var3=as.list(var3))
}

.B<-setRefClass(Class = "B"
               ,fields = list(var3 = "list")
               ,methods = list(initialize=B.initialize))
setGeneric("B", function(x, ...) standardGeneric("B"))
setMethod("B", "missing", function(x, ...) {
  .B()
})
setMethod("B", "ANY", function(x, ...) {
  .Part(var1=x, ...)
})
do.call(B,list(var3=list(1:3)))
Run Code Online (Sandbox Code Playgroud)

r generic-method s4

5
推荐指数
0
解决办法
165
查看次数

泛型方法的不同行为将值返回给方法和赋值

我面对代码,编译结果让我感到惊讶.

public class Test3{
    public static<K,V> Map<K,V> map(){return new HashMap<K,V>();}
}



class A{

    static void f(Map<String,Integer> bcMap){}

    public static void main(String[] args){
        f(Test3.map()) //not valid
        Map<String,Integer> m = Test3.map();//valid

    }
}
Run Code Online (Sandbox Code Playgroud)

总是我认为如果我将值传递给方法,则意味着方法参数分配给传递的值.

批准是否错误?

java generics variable-assignment argument-passing generic-method

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

为什么定义为"cons [B>:A](v:B)"的方法接受的类型的参数不是A的超类型?

我现在正在研究斯卡拉的变异,我认为我对逆变有很好的理解.例如trait List[-A],我知道这List[Int]是一个超类型List[AnyVal].

但是说我有以下特点:

trait List[+A] {
  def cons(hd: A): List[A]
}
Run Code Online (Sandbox Code Playgroud)

为什么cons参数类型错误?

为什么有必要def cons[B >: A](v: B): List[B]

例如:

val animal_list: List[Animal] = List(tiger, dog)
Run Code Online (Sandbox Code Playgroud)

如果我们打电话:

animal_list.cons(tiger)
Run Code Online (Sandbox Code Playgroud)

既然Tiger <: Animal,不会cons遇到问题?既然BTiger,A现在AnimalB >: A不是真的.

generics scala covariance contravariance generic-method

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

为什么在返回类型之前为静态泛型方法键入参数

以下noGood方法给出了编译错误,因为它在返回类型之前省略了正式类型参数T.

public static T noGood(T t) {
  return t;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解为什么静态泛型方法在返回类型之前需要一个类型参数?非静态方法不需要它吗?

java generics methods static generic-method

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

如何为泛型方法编写简洁的闭包?

我想编写一个具有泛型方法的函数式非泛型接口的实现。实现需要是内联闭包并且简洁。

作为一个简化的例子

@FunctionalInterface interface Fn {
    <R> R fn(R arg);
}
public class Scratch {
    Fn id = arg -> arg;
    //Fn nul = arg -> null;
    //Fn requiresNonNull = ...
}
Run Code Online (Sandbox Code Playgroud)

这使

/Scratch.java:5: error: incompatible types: invalid functional descriptor for lambda expression
    Fn id = arg -> arg;
            ^
    method <R>(R)R in interface Fn is generic
  where R is a type-variable:
    R extends Object declared in method <R>fn(R)
1 error
Run Code Online (Sandbox Code Playgroud)

(实际上,参数将是一个通用接口,其方法的返回类型为R。)

有没有一种解决方法,而无需回到匿名内部类的冗长?

有一个明显类似的问题,“无法将带有泛型方法的函数接口转换为 lambda …

java lambda generic-method generic-lambda

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

Java 泛型方法的返回类型中的上限和下限通配符

我试图解决一个我无法理解部分答案的问题。

以下是课程BackLister

public class BackLister {
    // INSERT HERE
    {
        List<T> output = new LinkedList<T>();
        for (T t : input)
            output.add(0, t);
        return output;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题问哪个可以插入到// INSERT HERE类中BackLister编译运行不会出错?

以下是选项:

A. public static <T> List<T> backwards(List<T> input)
B. public static <T> List<T> backwards(List<? extends T> input)
C. public static <T> List<T> backwards(List<? super T> input)
D. public static <T> List<? extends T> backwards(List<T> input)
E. public static <T> List<? super T> backwards(List<T> input)
F. …
Run Code Online (Sandbox Code Playgroud)

java generics wildcard generic-method

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