我正在尝试编写通用方法来转换类型.我想要写一些Cast.To<Type>(variable)代替的东西(Type) variable.我错误的这个方法版本:
public class Cast
{
public static T To<T>(object o)
{
return (T) o;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试:
public class A
{
public static explicit operator B(A a)
{
return new B();
}
}
public class B
{
}
A a = new A();
B b = Cast.To<B>(a);
Run Code Online (Sandbox Code Playgroud)
正如您所猜测的,此代码将失败InvalidCastException.
此代码是否失败,因为虚拟机不知道如何在运行时object将类型的变量转换为类型B?但是异常消息说:"无法将类型A的对象转换为类型B".所以CLR知道变量的真实类型o,为什么它不能执行转换?
这里有一个主要问题:我应该如何重写方法T To<T>(object o)来解决这个问题?
我有一个应用了应用程序插件的 Gradle 构建。应用程序插件还应用分发插件并创建默认main分发,这会将启动脚本放在bin文件夹中,将依赖项放在lib.
现在我想完全删除该默认行为并拥有自己的发行版但名称相同main。更准确地说,我不想要bin和lib文件夹,而是想要我的自定义内容。
我知道我可以轻松定义一个新的发行版,例如
distributions {
my {
// my configuration here
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以通过myDistZip例如产生所需的分布。
但我想准确地更改main分布,以便我能够通过简单distZip(或distTar)生成存档。
我试图删除主要分布(通过distributions.remove(distributions.main))并创建新的
distributions {
main {
// my configuration here
}
}
Run Code Online (Sandbox Code Playgroud)
但这失败了
Cannot add task ':distZip' as a task with that name already exists.
Run Code Online (Sandbox Code Playgroud)
我想这仅仅是因为 GradledistZip为每个新发行版创建任务,所以它也试图为新发行版这样做main,但是distZip在插件应用程序期间已经创建了任务。
那么,有没有办法改变main分配摆脱bin和lib文件夹?
等级:3.5
我有以下函数,它计算两个字符串之间的差异数:
distance1 :: String -> String -> Int
distance1 list1 list2 = length . filter (uncurry (/=)) $ zip list1 list2
Run Code Online (Sandbox Code Playgroud)
它工作得很好。可以在恒定空间内处理任何大小的列表。
我也在玩 - 比方说 - 这个函数的低级、基于递归、不好的实现,并具有以下内容:
distance2 :: String -> String -> Int
distance2 list1 list2 = distanceHelper 0 0
where
distanceHelper index result
| index == length list1 = result
| otherwise = distanceHelper (index + 1) (result + diff)
where
char1 = list1 !! index
char2 = list2 !! index
diff = if char1 /= char2 then …Run Code Online (Sandbox Code Playgroud)