我正在使用反射来查找 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)
但这有点麻烦,一定有更好的方法。
要么我使用谷歌太愚蠢,要么到目前为止没有其他人遇到过这个问题.
我正在尝试编译以下代码:
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;",我只是得到关于未经检查的演员的警告,但我不喜欢警告;-)有没有办法实现我想要的没有错误或警告?
我正在编写一个包含 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) 我想要做的是有一个方法,将泛型类型作为带有约束的参数.但是,约束的类型也有第二种泛型类型,但我希望该方法能够工作,无论第二次输入是什么:
public class IEvent<T> where T : EventArgs { }
public class EventManager
{
public void DoMethod<T>() where T: IEvent<???>
{
}
}
Run Code Online (Sandbox Code Playgroud)
具体来说,我试图让我的EventManager
班级接受任何类型的活动,然后用它做点什么.我是在过度复杂化,还是可行的?
我有一个参数列表,并希望通过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) 我面对代码,编译结果让我感到惊讶.
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
我现在正在研究斯卡拉的变异,我认为我对逆变有很好的理解.例如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
遇到问题?既然B
是Tiger
,A
现在Animal
和B >: A
不是真的.
以下noGood
方法给出了编译错误,因为它在返回类型之前省略了正式类型参数T
.
public static T noGood(T t) {
return t;
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解为什么静态泛型方法在返回类型之前需要一个类型参数?非静态方法不需要它吗?
我想编写一个具有泛型方法的函数式非泛型接口的实现。实现需要是内联闭包并且简洁。
作为一个简化的例子
@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 …
我试图解决一个我无法理解部分答案的问题。
以下是课程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) generic-method ×10
generics ×7
java ×5
c# ×2
r ×2
covariance ×1
lambda ×1
methods ×1
package ×1
r-s4 ×1
reflection ×1
s4 ×1
scala ×1
static ×1
wildcard ×1